Scanner.nextInt() NoSuchElementException

Я получил этот код (извините за немецкий внутри):

public void eingabewerte(){

    int steuerInt;
        steuerInt=-1;

    Scanner myScanner = new Scanner(System.in);
    System.out.println("Bitte geben Sie die maximal Augenzahl des Wuerfels an (Ganzzahl): ");

    try{
    this.max = myScanner.nextInt(); //liest den naechsten Integer Wert ein

    System.out.println("Bitte geben Sie an wie oft gewuerfelt werden soll (Ganzzahl): ");

    this.wurfzahl = myScanner.nextInt();

    System.out.println("Wollen Sie");
    System.out.println("----------");
    System.out.println("(1)die Eingabe neustarten                                               ");
    System.out.println("(2)einen Versuch mit den Werten: "+this.max+"|"+this.wurfzahl+" starten.");

   steuerInt = myScanner.nextInt();



    } catch (InputMismatchException e){ //wenn nicht Integer oder nicht der Radix entspricht oder outofRange
        e.printStackTrace();
        e.toString();
        System.out.println("Sie haben keinen Integer Wert oder einen zu großen/kleinen Integer Wert eingegeben!");
    } catch (IllegalStateException e) { //wenn der Scanner closed ist 
        e.toString();
        e.printStackTrace();
    }                                 //ende trycatch

   myScanner.close(); //Scanner schlieszen

    if (steuerInt == 1){
        System.out.println("----------------------------------------------------------------");
        System.out.println("Neue Eingabe");
        System.out.println("----------------------------------------------------------------");


        this.eingabewerte();        //eingabe neustarten

    } else if (steuerInt==2) {
        this.versuch(); 

    } else {

        System.out.println("Sie haben keine der erwarteten Steuerzeichen (Integer) 1 oder 2 eingegeben");
        this.programmabbruch();
    }

}

Теперь я возвращаюсь, если я печатаю в консоли

    Bitte geben Sie die maximal Augenzahl des Wuerfels an (Ganzzahl): 
1
Bitte geben Sie an wie oft gewuerfelt werden soll (Ganzzahl): 
2
Wollen Sie
----------
(1)die Eingabe neustarten                                               
(2)einen Versuch mit den Werten: 1|2 starten.
1
----------------------------------------------------------------
Neue Eingabe
----------------------------------------------------------------
Bitte geben Sie die maximal Augenzahl des Wuerfels an (Ganzzahl): 
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 aufgabe1oopwuerfel.Wuerfeltest.eingabewerte(Wuerfeltest.java:37)
    at aufgabe1oopwuerfel.Wuerfeltest.eingabewerte(Wuerfeltest.java:69)
    at aufgabe1oopwuerfel.Aufgabe1OOPWuerfel.main(Aufgabe1OOPWuerfel.java:22)
/home/r/.cache/netbeans/8.1/executor-snippets/run.xml:53: Java returned: 1

Я знаю документацию об исключении, но не понимаю, почему оно прерывается в этот момент. Надеюсь, кто-нибудь может помочь. Может быть, я должен понимать это совсем по-другому? Существует также другой метод под названием «programmabruch()», который приводит к бесконечному циклу. Этот метод вызывает себя таким же образом с этим стилем меню целочисленного ввода.

РЕДАКТИРОВАТЬ: теперь я попытался доказать, что целое число следует как

if(myScanner.hasNextInt()){
 this.max = myScanner.nextInt();
}

А потом я пытался

 if(myScanner.hasNextInt()){     
     this.max = Integer.parseInt(myScanner.nextLine());
    }

Это приводит к бесконечному циклу второго метода public void programmabruch(){...}

который включает в себя то же меню, что и в этом методе с int steuerInt..


person Pa.Don    schedule 19.04.2018    source источник
comment
Возможный дубликат ошибки сканера с nextInt()   -  person Turing85    schedule 19.04.2018


Ответы (1)


Когда ты это сделаешь

this.max = myScanner.nextInt(); //liest den naechsten Integer Wert ein

System.out.println("Bitte geben Sie an wie oft gewuerfelt werden soll (Ganzzahl): ");

this.wurfzahl = myScanner.nextInt();

ваше второе целочисленное назначение, this.wurfzahl = myScanner.nextInt();, вернет символ новой строки, поскольку он остался в вашем объекте сканера после того, как вы сделаете, this.max = myScanner.nextInt();, чтобы избежать этой проблемы, я бы переписал эти назначения, используя класс-оболочку Integer.

this.max = Integer.parseInt(myScanner.nextLine()); 
this.wurfzahl = Integer.parseInt(myScanner.nextLine());

Это займет всю следующую строку как строку, затем проанализирует ее и даст вам хорошее чистое целое число.

person treebeard    schedule 19.04.2018