• 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

Aruba Cloud - Virtual Private Server VPS
0 głosów
1,120 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 380 wizyt
0 głosów
0 odpowiedzi 779 wizyt
pytanie zadane 15 kwietnia 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
1 odpowiedź 383 wizyt
pytanie zadane 5 czerwca 2022 w C i C++ przez wasiu Nowicjusz (140 p.)

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...