2012-10-11 12 views
5

Sto cercando di utilizzare scanner per ottenere un int dalla tastiera, ma io ottenere il seguente errore:errore dello scanner con nextInt()

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Scanner.java:907) 
    at java.util.Scanner.next(Scanner.java:1530) 
    at java.util.Scanner.nextInt(Scanner.java:2160) 
    at java.util.Scanner.nextInt(Scanner.java:2119) 
    at TableReader.mainMenu(TableReader.java:122) 
    at TableReader.main(TableReader.java:76) 

Questo è quello che ho. È indipendente dal resto del mio programma, non capisco perché questo non funzioni. È dichiarato in un metodo che viene chiamato in un ciclo while, se questo aiuta.

// scan for selection 
    Scanner s = new Scanner(System.in); 
    int choice = s.nextInt();   // error occurs at this line 
    s.close(); 

Ho fatto un passo attraverso con il debugger e ristretto l'errore fino a:

È stato rilevato un errore fatale da parte del Java Runtime Environment: SIGSEGV (0xb) al pc = 0xb6bdc8a8, pid = 5587, tid = 1828186944

JRE versione: 7.0_07-b30 Java VM: OpenJDK Server VM (23.2-B09 modalità mista linux-x86) cornice Problematiche: V [libjvm.so + 0x4258a8] java_lang_String :: utf8_length (oopDesc *) + 0x58

Impossibile scrivere core dump. I dump del core sono stati disabilitati. Per abilitare il dumping principale, provare "ulimit -c unlimited" prima di riavviare Java

risposta

8

È necessario utilizzare i metodi hasNextXXXX() della classe Scanner per assicurarsi che sia disponibile un intero pronto per la lettura.

Il problema è che sono chiamati nextInt() che legge il numero intero successivo dal flusso che i Scanner punti degli oggetti da, se non ci sono interi lì a leggere (cioè se l'ingresso è esaurito, allora si vedrà che NoSuchElementException)

Dalle JavaDocs, il metodo nextInt() sarà gettare queste eccezioni in queste condizioni:

  • InputMismatchException - se il prossimo token non corrisponde all'espressione regolare Integer , o è fuori portata
  • NoSuchElementException - se l'ingresso è esaurito
  • IllegalStateException - se questo scanner è chiuso

È possibile risolvere questo facilmente utilizzando il metodo hasNextInt():

Scanner s = new Scanner(System.in); 
int choice = 0; 

if(s.hasNextInt()) 
{ 
    choice = s.nextInt(); 
} 

s.close(); 
+0

Questo mi manda in un ciclo infinito perché ciò che è all'interno delle parentesi non viene mai chiamato – spatara

+0

@spatara Sì, controlla se è possibile convertire qualsiasi elemento successivo a cui lo Scanner punta in un intero, se è possibile che 'hasNextInt()' restituisca true, altrimenti saràrestituisce falso. –

+0

Sto solo leggendo dalla tastiera, non c'è nextInt quando il metodo è chiamato – spatara

Problemi correlati