2012-10-11 5 views
5

Ich versuche, Scanner zu verwenden, um einen int von der Tastatur zu bekommen, aber ich folgende Fehlermeldung erhalten:Scannerfehler mit 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) 

Dies ist, was ich habe. Es ist unabhängig vom Rest meines Programms, ich verstehe nicht, warum das nicht funktioniert. Es wird in einer Methode deklariert, die in einer while-Schleife aufgerufen wird, wenn das hilft.

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

I mit dem Debugger trat durch und verengt den Fehler bis auf:

Ein schwerwiegender Fehler ist durch die Java-Laufzeitumgebung erkannt wurde: SIGSEGV (0xb) bei PC = 0xb6bdc8a8, pid = 5587, tid = 1828186944

JRE-Version: 7.0_07-b30 Java VM: OpenJDK Server VM (23,2-b09 gemischten Modus linux-x86) Problematische Rahmen: V [libjvm.so + 0x4258a8] java_lang_String :: utf8_length (oopDesc *) + 0x58

Fehler beim Schreiben des Core Dumps. Core Dumps wurden deaktiviert. Versuchen Sie "ulimit -c unlimited", bevor Sie Java erneut starten.

Antwort

8

Sie sollten die hasNextXXXX()-Methoden aus der Klasse Scanner verwenden, um sicherzustellen, dass eine ganze Zahl zum Lesen bereitsteht.

Das Problem wird man nextInt() genannt werden, die die nächste ganze Zahl aus dem Stream liest, dass die Scanner-Objekt auf, wenn es keine ganze Zahl ist zu lesen (dh, wenn der Eingang erschöpft ist, dann werden Sie sehen, dass NoSuchElementException)

von dem JavaDocs, die nextInt() Methode wird diese Ausnahmen unter diesen Bedingungen werfen:

  • InputMismatchException - wenn das nächste Token nicht den regulären Ausdruck Integer entsprechen, oder ist außerhalb des zulässigen Bereichs
  • NoSuchElementException - wenn Eingang
  • Illegal erschöpft ist - wenn dieser Scanner

geschlossen ist du die hasNextInt() Methode einfach mit beheben:

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

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

s.close(); 
+0

Dieser schickt mich in eine Endlosschleife, weil was wird innerhalb der Klammern nie aufgerufen – spatara

+0

@spatara Ja überprüft es, ob das nächste Element, auf das der Scanner verweist, erfolgreich in eine Ganzzahl konvertiert werden kann, wenn es dann 'hasNextInt()' zurückgeben kann, andernfalls wird es falsch zurückgeben. –

+0

Ich lese gerade von der Tastatur, es gibt keine nextInt, wenn die Methode aufgerufen wird – spatara

Verwandte Themen