• 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
68 wizyt
pytanie zadane 18 lutego 2017 w Java przez plkpiotr Stary wyjadacz (12,460 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,460 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,460 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 46 wizyt
pytanie zadane 15 kwietnia 2017 w Java przez plkpiotr Stary wyjadacz (12,460 p.)
0 głosów
2 odpowiedzi 172 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,830 p.)
0 głosów
1 odpowiedź 95 wizyt
pytanie zadane 29 sierpnia 2016 w C i C++ przez plkpiotr Stary wyjadacz (12,460 p.)
Porady nie od parady
Wynikowy wygląd pytania, odpowiedzi czy komentarza, różni się od tego zaprezentowanego w edytorze postów. Stosuj więc funkcję Podgląd posta znajdującą się pod edytorem, aby upewnić się, czy na pewno ostateczny rezultat ci odpowiada.
Ciekawy innych porad? Odwiedź tę stronę!

45,873 zapytań

86,345 odpowiedzi

172,633 komentarzy

22,284 pasjonatów

Przeglądających: 114
Pasjonatów: 8 Gości: 106

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.

...