Am primit o excepție de timp de execuție în programul meu în timp ce citesc un fișier prin intermediul unui Scanner.
java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at Day1.ReadFile.read(ReadFile.java:49)
at Day1.ParseTree.main(ParseTree.java:17)
Codul meu este:
while((str=sc.nextLine())!=null){
i=0;
if(str.equals("Locations"))
{
size=4;
t=3;
str=sc.nextLine();
str=sc.nextLine();
}
if(str.equals("Professions"))
{
size=3;
t=2;
str=sc.nextLine();
str=sc.nextLine();
}
if(str.equals("Individuals"))
{
size=4;
t=4;
str=sc.nextLine();
str=sc.nextLine();
}
int j=0;
String loc[]=new String[size];
while(j<size){
beg=0;
end=str.indexOf(',');
if(end!=-1){
tmp=str.substring(beg, end);
beg=end+2;
}
if(end==-1)
{
tmp=str.substring(beg);
}
if(beg<str.length())
str=str.substring(beg);
loc[i]=tmp;
i++;
if(i==size ){
if(t==3)
{
location.add(loc);
}
if(t==2)
{
profession.add(loc);
}
if(t==4)
{
individual.add(loc);
}
i=0;
}
j++;
System.out.print("
");
}
cu Scanner
trebuie să verifici dacă există o linie următoare cu hasNextLine()
astfel încât bucla să devină
while(sc.hasNextLine()){
str=sc.nextLine();
//...
}
sunt cititorii care returnează null pe EOF
desigur, în această bucată de cod, acest lucru depinde de formatarea corectă a datelor de intrare.
Ați apelat nextLine()
și se aruncă o excepție atunci când nu există nicio linie, exact așa cum este descris în javadoc. Nu va returna niciodată null
http://download.oracle.com/javase/1,5.0/docs/api/java/util/Scanner.html
Și eu mă confrunt cu această problemă. În cazul meu, problema a fost că am închis scanerul în interiorul uneia dintre funcțiile…
Codul de mai sus a făcut aceeași exapțiune, soluția a fost să închid scanerul doar o singură dată la main.
- Mulțumesc pentru asta, amice, am rămas blocat de această mică greșeală – > .
- Am o problemă similară. Vreau să știu de ce nu funcționează dacă închid scanerul și îl reinitializez din nou când citesc următoarea linie. Ar trebui ca ambele să fie instanțe diferite ale scanerului, nu? De ce ar afecta închiderea unei instanțe a scanerului pe cealaltă? – > .
Adevărata dvs. problemă este că apelați „sc.nextLine()” DE MAI MULTE ORI decât numărul de linii.
De exemplu, dacă aveți doar ZECE linii de intrare, atunci puteți NUMAI apelați „sc.nextLine()” TEN ori.
De fiecare dată când apelați „sc.nextLine()”, se va consuma o linie de intrare. Dacă apelați „sc.nextLine()” DE MAI MULTE ORI decât numărul de linii, veți avea o excepție numită
"java.util.NoSuchElementException: No line found".
Dacă trebuie să apelați „sc.nextLine()” n ori, atunci trebuie să aveți cel puțin n linii.
Încercați să vă modificați codul pentru a face să corespundă numărul de apeluri „sc.nextLine()” cu numărul de linii și vă garantez că problema dvs. va fi rezolvată.
Indiferent de motiv, clasa Scanner emite aceeași excepție dacă întâlnește caractere speciale pe care nu le poate citi. Dincolo de utilizarea hasNextLine()
înainte de fiecare apel la nextLine()
, , asigurați-vă că codificarea corectă este transmisă către Scanner
constructor, de exemplu:
Scanner scanner = new Scanner(new FileInputStream(filePath), "UTF-8");
Trebuie să folosiți comentariul de sus, dar, de asemenea, acordați atenție la nextLine(). Pentru a elimina această eroare, apelați doar
sc.nextLine()
o singură dată din interiorul buclei while
while (sc.hasNextLine()) {sc.nextLine()...}
Folosiți while doar pentru a privi înainte 1 linie. Apoi utilizați sc.nextLine() pentru a citi 2 linii înainte de singura linie pe care ați cerut buclei while să se uite înainte.
De asemenea, modificați mai multe IF în IF, ELSE pentru a evita citirea a mai mult de o linie.
sc
a fost declarat și deschis. – > Por Jim Garrison.