java.util.NoSuchElementException: nessuna riga trovata

Ho ottenuto un’eccezione di run time nel mio programma mentre sto leggendo un file tramite uno 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) 

Il mio codice è:

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

con Scanner è necessario verificare se c’è una riga successiva con hasNextLine()

così il ciclo diventa

 while(sc.hasNextLine()){ str=sc.nextLine(); //... } 

sono i lettori che restituiscono null su EOF

naturalmente in questo pezzo di codice questo dipende dal fatto che l’input sia formattato correttamente

Stai chiamando nextLine() e lancia un’eccezione quando non c’è alcuna linea, esattamente come descrive la javadoc. Non restituirà mai null

http://download.oracle.com/javase/1,5.0/docs/api/java/util/Scanner.html

Per qualsiasi ragione, la class Scanner emette anche questa stessa eccezione se incontra caratteri speciali che non può leggere. Oltre a utilizzare il metodo hasNextLine() prima di ogni chiamata a nextLine() , assicurarsi che la codifica corretta sia passata al costruttore Scanner , ad esempio:

Scanner scanner = new Scanner(new FileInputStream(filePath), "UTF-8");

Il tuo vero problema è che chiami “sc.nextLine ()” più volte del numero di righe.

Ad esempio, se hai solo 10 linee di input, puoi chiamare “sc.nextLine ()” solo 10 volte.

Ogni volta che chiami “sc.nextLine ()”, verrà consumata una linea di input. Se chiami “sc.nextLine ()” più volte del numero di righe, avrai un’eccezione chiamata “java.util.NoSuchElementException: Nessuna riga trovata”.

Se devi chiamare “sc.nextLine ()” n volte, allora devi avere almeno n linee.

Prova a cambiare il tuo codice in modo che corrisponda al numero di volte che chiami “sc.nextLine ()” con il numero di linee e ti garantisco che il tuo problema sarà risolto.