java.util.NoSuchElementException: Nu s-a găsit nicio linie (Programare, Java, Java.Util.Scanner)

Ashish Panery a intrebat.

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("
");
}

Comentarii

  • Bine ați venit la SO. Atunci când postați codul, ar trebui să aveți grijă să îl formatați pentru a fi ușor de citit… adică să eliminați liniile goale inutile, să îl indentați corespunzător. De asemenea, formatați stacktrace-ul ca și cod pentru a-l face lizibil. Am corectat formatarea pentru tine. –  > Por Jim Garrison.
  • De asemenea, ați omis cea mai importantă piesă, și anume modul în care sc a fost declarat și deschis. –  > Por Jim Garrison.
6 răspunsuri
ciudat cu clichet

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.

Brian Roach

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

agr

Ș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.

Comentarii

  • Mulțumesc pentru asta, amice, am rămas blocat de această mică greșeală –  > Por Aidan Ward.
  • 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ă? –  > Por Kaushik Evani.
William Hou

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ă.

Luís de Sousa

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");

Adam M. Erickson

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.