java.util.InputMismatchException Fehler Java Scanner

NoOffensePls

Neues Mitglied
Hallo, kann mir jemand helfen mein Problem zu lösen?
Im CMD bekomme ich folgenden Fehler:

Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
at ToDo.main(todo.java:16)

So sieht das Script meiner Main Class aus:

[CODE lang="java" title="Main Class" highlight="11"]public static void main (String [] args){


System.out.println("Willkommen ...?");

System.out.println("[1] ..." + '\n' + "[2] ..." + '\n' + "[3] ..." + '\n' + "[4] ...");

Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\n");

int auswahl = scanner.nextInt();
String neuerTitel = scanner.next();

if (auswahl==1){

listeAlleAufgaben();
}else{
if (auswahl==2){

neueAufgabe(neuerTitel);
}else{
if (auswahl==3){

loescheAufgabe(neuerTitel);
}else{
if (auswahl==4){

System.out.println("Ungültige Eingabe");
}
}

}
}

scanner.close();
}[/CODE]
 
Also der Code alleine reicht erst einmal nicht aus. Wo genau ist die Exception geworfen worden? (Sprich: Was ist die Zeile 16 in todo.java?)
Und was genau hast du eingegeben?

Wenn ich raten müsste: Du willst Zahl und Titel eingegeben haben. Delimiter ist aber nur der Zeilenumbruch/Enter. Wenn Du es aber nun mit Leerzeichen eingibst, dann versucht er Zahl und Text als int zu lesen was natürlich nicht geht.

Allgemeine Anmerkungen:
- Scanner zu schließen schließt auch den zugrunde liegenden Stream. Dadurch schliesst Du System.in, was man nicht machen sollte.
- Du kannst bei if else if die Geschweiften Klammern nach dem else weglassen. Dann hast Du deutlich weniger Einrückungen.
- Bei so einer Auswahl macht es Sinn, switch zu benutzen statt if else if else if else ...
 
Scanner zu schließen schließt auch den zugrunde liegenden Stream. Dadurch schliesst Du System.in, was man nicht machen sollte.
Eine Frage bitte dazu. Im Internet stoße ich oft auf die Meinung den Scanner unbedingt zu schließen, etwa um "Ressourcen freizugeben" . Ein Beispiel hier:
"Wichtig ist, dass der Scanner zum Schluss mit close() geschlossen wird." aus:https://javabeginners.de/Ein-_und_Ausgabe/Scanner.php
Warum ist es denn nun nicht gut den Scanner zu schließen? Oder bezieht sich diese Aussage nur darauf, wenn der Scanner in Schleifen arbeitet?
Wo genau liegt da das Problem?
 
Im Internet stoße ich oft auf die Meinung den Scanner unbedingt zu schließen, etwa um "Ressourcen freizugeben"
Und damit hast Du schon des Pudels Kern genannt. Code soll die Ressourcen freigeben, für die er verantwortlich ist - aber nur für die und für keine anderen 🙂

Stell Dir mal vor, Du öffnest eine Datei und rufst eine Methode auf, die z. B. eine Zeile aus der Datei liest. Dann möchtest Du ja davon ausgehen können, dass nach dem Methodenaufruf die Datei weiterhin geöffnet ist.

Die aufgerufene Methode ist nicht für die Ressource verantwortlich, daher hat sie diese auch nicht freizugeben.

System.in ist eine Ressource, die von der Java Plattform zur Verfügung gestellt wird. Wenn Du einen Scanner für System.in einrichtest und diesen Scanner schließt, wird System.in geschlossen. Du ziehst der Plattform die Ressource unter den Füßen weg. In der Folge kann kein weiterer Code von System.in lesen.

Etwas anderes wäre Code, der eine Datei öffnet, einen Scanner für den FileInputStream einrichtet, mit dem Scanner aus der Datei liest und am Ende, wenn die Datei geschlossen werden kann, den Scanner schließt. Da wäre das Schließen völlig in Ordnung, da der FileInputStream sowieso geschlossen werden muss.
 
Das habe ich also falsch gemacht, seitdem ich den Scanner benutze. Und ich habe es nicht einmal registriert!
Super, vielen Dank dafür🍾
Fies ist: bei kleinen Progrämmchen merkt man das z. T. nicht. Wenn Du aber mal in einer Schleife den Scanner für System.in schließt, wirst Du ganz schnell erkennen, dass das keine gute Idee war 🙂
 

Zurück
Oben