2012-10-11 12 views
5

Próbuję użyć skanera, aby uzyskać int z klawiatury, ale otrzymuję następujący błąd:błąd skanera z 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) 

To jest to, co mam. Jest niezależny od reszty mojego programu, nie rozumiem, dlaczego to nie działa. Jest zadeklarowany w metodzie, która jest wywoływana w pętli while, jeśli to pomaga.

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

Wszedłem przez z debugera i zawężony błąd w dół do:

krytyczny błąd został wykryty przez Java Runtime Environment: SIGSEGV (0XB) na pc = 0xb6bdc8a8, PID = 5587, tid = 1828186944

JRE wersja: 7.0_07-B30 Java VM: OpenJDK serwera VM (23,2-B09 tryb mieszany Linux x86) Problematyczne ramy: V [libjvm.so + 0x4258a8] java_lang_String :: utf8_length (oopDesc *) + 0x58

Nie można zapisać zrzutu pamięci. Zrzuty rdzenia zostały wyłączone. Aby włączyć zrzut dumpingu, spróbuj "ulimit -c unlimited" przed ponownym uruchomieniem Java

Odpowiedz

8

Powinieneś użyć metod hasNextXXXX() z klasy Scanner, aby upewnić się, że istnieje liczba całkowita gotowa do odczytania.

Problem jesteście wezwani nextInt() który odczytuje następną liczbę całkowitą ze strumienia że Scanner punkty obiektów do, jeśli nie ma całkowitą tam do odczytu (czyli jeśli wejście jest wyczerpany wtedy widać, że NoSuchElementException)

z Javadocs metoda nextInt() rzuci te wyjątki w tych warunkach:

  • InputMismatchException - jeśli następny znak nie odpowiada Integer wyrażenia regularnego, lub znajduje się poza zasięgiem
  • NoSuchElementException - jeśli wejście jest wyczerpany
  • IllegalStateException - jeśli ten skaner jest zamknięty

można naprawić ten łatwo stosując metodę hasNextInt():

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

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

s.close(); 
+0

to wysyła mnie do nieskończonej pętli bo co znajduje się w nawiasach nigdy nie jest nazywane – spatara

+0

@ spatara Tak sprawdza, czy cokolwiek następny element, na który wskazuje Skaner, może być z powodzeniem przekonwertowany na liczbę całkowitą, jeśli może wtedy 'hasNextInt()' zwróci wartość true, w przeciwnym razie będzie return false. –

+0

Po prostu czytam z klawiatury, nie ma następnegoInt, gdy metoda nazywa się – spatara

Powiązane problemy