Ich komme hier nicht klar. Den Code habe ich auf das Problem reduziert, deshalb ist er relativ sinnlos.
Zum Problem: Wenn ich in der Konsole zwei Zahlen, getrennt durch Leerzeichen eingebe, werden sie mir auch zurückgegeben. Wenn ich nur eine Zahl eingebe, hängt sich die Konsole auf bzw. terminiert einfach nicht.
Java:
// Scannt zwei Ganzzahlen ein und gibt sie aus.publicstaticvoidmain(String[] args){Scanner in;boolean exit =false;int[] values =newint[2];while(!exit){
in =newScanner(System.in);System.out.print("Eingabe: ");if(in.hasNext()){if(in.hasNextInt()){
values[0]= in.nextInt();if(in.hasNextInt()){
values[1]= in.nextInt();if(values[0]==0&& values[1]==0){
exit =true;}else{System.out.println("Sie haben "+ values[0]+" "+ values[1]+" eingegeben.");}}else{System.out.println("Bitte geben Sie zwei ganze Zahlen ein.");}}else{System.out.println("Bitte geben Sie zwei ganze Zahlen ein.");}}}}
Du erwartest ja auch, dass der Benutzer zwei Zahlen eingibt.
Was sollte Deiner Ansicht nach sonst passieren? Das Programm wartet so lange, bis zwei Zahlen eingegeben wurden.
Eigentlich wollte ich, dass die Nachricht "Bitte geben Sie zwei ganze Zahlen ein." kommt, wenn nur eine Zahl eingegeben wurde und mit Enter bestätigt wurde.
Ich dachte wenn nichts da steht, dann ist hasNextInt() == false. Und somit müsste es ja zum else springen. Nichts ist ja wohl kein Int!??? Oder doch?
Nein, aber die Methode blockiert solange, bis eine Eingabe erfolgt. Erfolgt keine weitere Eingabe, dann blockt das Programm. Du müsstest irgendwie ein TimeOut da reinbauen, damit du es dann, wenn es möglich ist, an der Stelle einfach das beendest.
Nein, aber die Methode blockiert solange, bis eine Eingabe erfolgt. Erfolgt keine weitere Eingabe, dann blockt das Programm. Du müsstest irgendwie ein TimeOut da reinbauen, damit du es dann, wenn es möglich ist, an der Stelle einfach das beendest.
Dein Statement hat mich jetzt auf die richtige Richtung geleitet, nachdem ich schon ganz genervt war, weil ich keine Lösung gefunden hatte. Tatsächlich blockiert auch die hasNextInt() / hasNext() - Methode. Dabei müsste man eigentlich meinen, dass die dazu da sei um zu schauen, ob es blockieren wird. Leider kann man den System.in- Stream nicht schließen.
Momentan macht es aus meiner Sicht den Anschein, dass der Scanner einfach nicht für System.in geeignet ist. Um ihn anzupassen (wenn das überhaupt möglich ist) müsste man wohl einen deutlich unschöneren Code erzeugen als wenn man gleich BufferedReader verwendet. Somit verwende ich vorerst für System.in wieder die alte Lösung.
Ich werde den Thread aber noch nicht auf gelöst setzen, weil ich die Hoffnung habe, dass doch irgendwann jemand einen Einfall hat, wie man das schön lösen kann, sodass sich der Scanner lohnt, denn seine Möglichkeiten sind für Fehlerbehandlung eigentlich sehr viel versprechend und würden vergleichsweise eine Menge Code sparen.
Man benutzt zwei Scanner. Der erste liest die ganze Zeile und der zweite zerlegt sie:
Java:
// Scannt zwei Ganzzahlen ein und gibt sie aus.publicstaticvoidmain(String[] args){Scanner in =newScanner(System.in);Scanner parseIn;boolean exit =false;int[] values =newint[2];while(!exit){
in =newScanner(System.in);System.out.print("Eingabe: ");
parseIn =newScanner(in.nextLine());if(parseIn.hasNextInt()){
values[0]= parseIn.nextInt();if(parseIn.hasNextInt()){
values[1]= parseIn.nextInt();if(values[0]==0&& values[1]==0){
exit =true;}else{System.out.println("Sie haben "+ values[0]+" "+ values[1]+" eingegeben.");}}else{System.out.println("Bitte geben Sie zwei ganze Zahlen ein.");}}else{System.out.println("Bitte geben Sie zwei ganze Zahlen ein.");}}}