2016-05-07 8 views
0

Ich versuche, ein einfaches Menü mit einer Do-While-Schleife in Java zu machen. Mein Code sieht wie folgt aus:Einfache Menüs mit Do-While-Schleifen in Java

int choice; 
    Scanner scanChoice = new Scanner(System.in); 
    do { 
     System.out.println("Pick an option. 1 2 or 3."); 
     System.out.println("1. Apple"); 
     System.out.println("2. Pear"); 
     System.out.println("3. Pineapple"); 

     choice = scanChoice.nextInt(); 
    } while (choice < 1 || choice > 3); 

    System.out.println("You picked " + choice); 

Das Problem ist, dass ich jedes Mal versuchen, es zu laufen, es wirft „java.util.NoSuchElementException“. Der vollständige Fehler ist unten:

Exception in thread "main" java.util.NoSuchElementException 
at java.util.Scanner.throwFor(Scanner.java:862) 
at java.util.Scanner.next(Scanner.java:1485) 
at java.util.Scanner.nextInt(Scanner.java:2117) 
at java.util.Scanner.nextInt(Scanner.java:2076) 
at mainPackage.Main.fruitMenu(Main.java:135) 
at mainPackage.Main.main(Main.java:103) 

Ich weiß, dass dies, weil scanChoice.hasNextInt() kehrt falsch ist, aber ich bin nicht sicher, wie dies zu beheben. Wenn ich eine if-Anweisung (if (scanChoice.hasNextInt())) hinzufüge, gibt die Methode scanChoice.hasNextInt() immer noch false zurück, also wird nur die Zeile übergeben, die die Variable choice initialisiert, und diese Variable wird nie initialisiert.

Wer weiß, wie man das beheben kann?

EDIT: Das Problem ist, dass es nicht darauf wartet, dass der Benutzer eine andere ganze Zahl eingibt. Die Funktion scanchoice.nextInt() und die Funktion scanChoice.nextLine() geben beide sofort keinen Wert zurück, ohne darauf zu warten, dass der Benutzer einen Wert eingibt. Irgendeine Möglichkeit, es auf Eingabe warten zu lassen?

+0

Aber Sie haben eine Zahl eingeben, nicht nur auf "Enter", oder? –

+0

Es gibt keine Zeit für mich, eine Nummer einzugeben. Es geht einfach weiter und wirft die 'NoSuchElementException' –

+0

Wie führen Sie diesen Code? Es sollte Ihnen diese Ausnahme nicht geben, es sei denn, Sie starten es mit einer leeren Standardeingabe, z. durch ein Skript oder vielleicht in einer IDE, die keine Texteingabe für Befehlszeilen-Apps unterstützt. Vergleichen http://StackOverflow.com/Questions/13729294/Nosuchelementexception-with-Java-Util-scanner#comment18864529_13729470 – zapl

Antwort

0

Es scheint für mich, konsequent zu arbeiten. Für alle gültigen Ganzzahlen funktioniert es wie erwartet, entweder akzeptiert die Eingabe oder geht durch eine Schleife, und wenn ungültige Eingabe wie "abcd" eingegeben wird, wirft es InputMismatchException, das ist das erwartete Verhalten sowieso.

Online Java compiler IDE

+0

mein Code wartet nicht auf mich, um einen Wert einzugeben. Es gibt sofort keinen Wert zurück und gibt mir die Ausnahme –

0

Ich habe Ihren Code robuster. Es fängt alphanumerische Zeichen auf und zeigt das Menü erneut an, anstatt mit einer InputMismatchException zu brechen.

Hier ist ein Testlauf.

Pick an option. 1 2 or 3. 
1. Apple 
2. Pear 
3. Pineapple 
x 
Pick an option. 1 2 or 3. 
1. Apple 
2. Pear 
3. Pineapple 
asdf 
Pick an option. 1 2 or 3. 
1. Apple 
2. Pear 
3. Pineapple 
2 
You picked 2 

Und hier ist der Code. Ich habe den Scanner nextLine Methode aufgerufen.

package com.ggl.testing; 

import java.util.Scanner; 

public class MenuTest { 

    public static void main(String[] args) { 
     int choice; 
     Scanner scanChoice = new Scanner(System.in); 

     do { 
      System.out.println("Pick an option. 1 2 or 3."); 
      System.out.println("1. Apple"); 
      System.out.println("2. Pear"); 
      System.out.println("3. Pineapple"); 

      String input = scanChoice.nextLine(); 
      choice = convertToInteger(input.trim()); 
     } while (choice < 1 || choice > 3); 

     System.out.println("You picked " + choice); 
     scanChoice.close(); 
    } 

    private static int convertToInteger(String input) { 
     try { 
      return Integer.valueOf(input); 
     } catch (NumberFormatException e) { 
      return Integer.MIN_VALUE; 
     } 
    } 

} 
+0

Ich führe dies in Eclipse IDE, und der Code, den Sie in die Funktion 'main (String [] args)' setzen, ist in meinem Programm in einer eigenen Funktion, die aufgerufen wird in der 'main()' -Funktion. Wenn ich versuche, Ihren Code auszuführen, bekomme ich immer noch den gleichen Fehler, eine 'java.util.NoSuchElementException'. Irgendwelche anderen Ideen? –

+0

@Lucas B: Hast du meinen Code genau so ausgeführt, wie ich ihn geschrieben habe, ohne Änderungen? Weil ich den Testlauf in die Antwort eingefügt habe. Wenn du ein anderes Problem hast, musst du ** all ** deines Codes in deiner Frage posten. –