• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czytanie z pliku - NoSuchElementException: No line found

Object Storage Arubacloud
0 głosów
861 wizyt
pytanie zadane 18 lutego 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 18 lutego 2017 przez plkpiotr

Próbuję wczytać poniższy plik składający się z 16 powtarzających czterolinijkowych się struktur:

Arka Augustów
AUG
Stadion Augustowski
01 01 01 01 2 6 8 8
Błyskawica Białystok
BIA
Stadion Miejski w Białymstoku
02 02 02 02 2 6 8 8
Czarni Cieszanów
CIE
Arena Cieszanów
03 03 03 03 2 6 8 8
Diament Drohiczyn
DRO
Arena Drohiczyn
04 04 04 04 2 6 5 5
Galicja Grajewo
GRA
Stadion Miejski w Grajewie
05 05 05 05 2 6 8 8
Hetman Hrubieszów
HRU
Stadion im. Witolda Pileckiego
06 06 06 06 2 6 8 9
Jutrzenka Jedwabne
JED
MOSiR w Jedwabnem
07 07 07 07 2 6 1 8
Korona Kraśnik
KRA
Stadion Miejski w Kraśniku
08 08 08 08 2 6 2 8
Naprzód Nisko
NIS
MOSiR w Nisku
09 09 09 09 2 6 8 3
Olimpia Oleszyce
OLE
Arena Oleszyce
10 10 10 10 3 6 4 8
Pogoń Przemyśl
PRZ
Stadion im. Łukasza Cieplińskiego
11 11 11 11 3 6 9 8
Ruch Rudnik
RUD
Stadion Miejski w Rudniku
12 12 12 12 3 6 2 8
Sokół Sokółka
SOK
Stadion Miejski w Sokółce
13 13 13 13 3 6 3 8
Tłoki Tarnobrzeg
TAR
Stadion im. Zbigniewa Herberta
14 14 14 14 3 7 4 9
Unia Ulanów
ULA
Stadion w Ulanowie
15 15 15 15 3 9 4 1
Zawisza Zamość
ZAM
Stadion im. Jana Łożańskiego
16 16 16 16 1 6 4 2

Udało mi się odczytać dane poprawnie za pomocą takiego kodu z użyciem licznika:

Scanner scanner = new Scanner(file);
String name, abbreriation, stadium, logo, turf, kitHome, kitAway;
int amountPass, amountCross, amountShoot, strategy;
int counter = 0;
while (scanner.hasNextLine()) {
	counter++;
	name = scanner.nextLine();
	// System.out.println(name);
	abbreriation = scanner.nextLine();
	// System.out.println(abbreriation);
	stadium = scanner.nextLine();
	// System.out.println(stadium);
	logo = scanner.next();
	// System.out.println(logo);
	turf = scanner.next();
	// System.out.println(turf);
	kitHome = scanner.next();
	// System.out.println(kitHome);
	kitAway = scanner.next();
	// System.out.println(kitAway);
	amountPass = scanner.nextInt();
	// System.out.println(amountPass);
	amountCross = scanner.nextInt();
	// System.out.println(amountCross);
	amountShoot = scanner.nextInt();
	// System.out.println(amountShoot);
	strategy = scanner.nextInt();
	// System.out.println(strategy);
	if (count < 16)
		scanner.nextLine();
}

Jeżeli zakomentuję linię 26 zostaje wyrzucony wyjątek, że próbuję dostać się o linię za daleko...

java.util.NoSuchElementException: No line found

W jaki sposób mogę to zrobić elegancko, tak aby program bez sprawdzania ilości danych faktycznie czytał je tylko do końca pliku? Zmienić rozmieszenie danych w pliku tekstowym, skorzystać z innej klasy, czy może jednak lekko zmodyfikować moje rozwiązanie?

1 odpowiedź

+1 głos
odpowiedź 18 lutego 2017 przez arkus Bywalec (2,160 p.)
wybrane 18 lutego 2017 przez plkpiotr
 
Najlepsza
Ostatnia rzecz, którą zczytujesz w pętli to `int`, więc scanner nie przechodzi do nowej linii. Stąd się pojawiają błędy, bo w drugim przejsciu pętli pod `name` jest pusta linia.

Dodaj na końcu pętli `scanner.nextLine()`, powinno działać.
komentarz 18 lutego 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
W obu przypadkach używam scanner.nextLine(), wtedy gdy pojawia się wyjątek i wtedy kiedy nie zostaje wyrzucony.

Jeżeli ta instrukcja jest ostatnią bez if'a to właśnie wtedy pojawia się wyjątek, gdy zachowam if'a to wyjątku już nie ma ; )
1
komentarz 18 lutego 2017 przez arkus Bywalec (2,160 p.)
if (scanner.hasNext()) {
        scanner.nextLine();
}

Zamiast sprawdzania po counterze, sprawdz na koncu czy jest jeszcze coś w pliku

komentarz 18 lutego 2017 przez plkpiotr Stary wyjadacz (12,420 p.)

Bardzo dziękuję za pomoc ; ) Działa zgodnie z zamierzeniem : )

Scanner scanner = new Scanner(file);
String name, abbreriation, stadium, logo, turf, kitHome, kitAway;
int amountPass, amountCross, amountShoot, strategy, lineUp;
while (scanner.hasNextLine()) {
	name = scanner.nextLine();
	abbreriation = scanner.nextLine();
	stadium = scanner.nextLine();
	logo = scanner.next();
	turf = scanner.next();
	kitHome = scanner.next();
	kitAway = scanner.next();
	amountPass = scanner.nextInt();
	amountCross = scanner.nextInt();
	amountShoot = scanner.nextInt();
	strategy = scanner.nextInt();
	lineUp = scanner.nextInt();
	league.add(new Club(name, abbreriation, stadium, logo, turf, kitHome, kitAway, amountPass,
			amountCross, amountShoot, strategy, lineUp));
	if (scanner.hasNext())
                scanner.nextLine();
}

Podobne pytania

0 głosów
2 odpowiedzi 314 wizyt
0 głosów
0 odpowiedzi 686 wizyt
pytanie zadane 15 kwietnia 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
1 odpowiedź 198 wizyt
pytanie zadane 5 czerwca 2022 w C i C++ przez wasiu Nowicjusz (140 p.)

92,539 zapytań

141,382 odpowiedzi

319,480 komentarzy

61,928 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...