• 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

0 głosów
139 wizyt
pytanie zadane 18 lutego 2017 w Java przez plkpiotr Stary wyjadacz (12,520 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,180 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,520 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,180 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,520 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
0 odpowiedzi 108 wizyt
pytanie zadane 15 kwietnia 2017 w Java przez plkpiotr Stary wyjadacz (12,520 p.)
0 głosów
2 odpowiedzi 331 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,850 p.)
0 głosów
1 odpowiedź 103 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez plkpiotr Stary wyjadacz (12,520 p.)
Porady nie od parady
Możesz ukryć, zamknąć lub zmodyfikować swoje pytanie, za pomocą przycisków znajdujących się pod nim. Nie krępuj się poprawić pochopnie opublikowanego pytania czy zamknąć go po uzyskaniu satysfakcjonującej odpowiedzi. Umożliwi to zachowanie porządku na forum.Przyciski pytania

56,493 zapytań

101,200 odpowiedzi

208,601 komentarzy

28,162 pasjonatów

Przeglądających: 216
Pasjonatów: 8 Gości: 208

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...