try / catch mit InputMismatchException erstellt Endlosschleife

Also baue ich ein Programm, das von Benutzereingaben ausgeht. Ich habe, was scheint, ein sehr direkter Versuch / catch-Block, der, wenn der Benutzer einen int nicht eingibt, den Block wiederholen sollte, bis sie tun. Hier ist der relevante Teil des Codes:

import java.util.InputMismatchException; import java.util.Scanner; public class Except { public static void main(String[] args) { Scanner input = new Scanner(System.in); boolean bError = true; int n1 = 0, n2 = 0, nQuotient = 0; do { try { System.out.println("Enter first num: "); n1 = input.nextInt(); System.out.println("Enter second num: "); n2 = input.nextInt(); nQuotient = n1/n2; bError = false; } catch (Exception e) { System.out.println("Error!"); } } while (bError); System.out.printf("%d/%d = %d",n1,n2, nQuotient); } } 

Wenn ich eine 0 für die zweite ganze Zahl eingib, dann macht das try / catch genau das, was es soll und bringt mich dazu, es wieder einzufügen. Aber, wenn ich eine InputMismatchException wie durch Eingabe von 5.5 für eine der Zahlen habe, zeigt es nur meine Fehlermeldung in einer Endlosschleife. Warum passiert das und was kann ich dagegen tun? (Übrigens habe ich versucht, InputMismatchException explizit als Argument zu fangen, aber das Problem wurde nicht behoben.

Sie müssen next(); aufrufen next(); wenn du den Fehler bekommst. Auch ist es ratsam, hasNextInt()

  catch (Exception e) { System.out.println("Error!"); input.next();// Move to next other wise exception } 

Bevor Sie den ganzzahligen Wert lesen, müssen Sie sicherstellen, dass der Scanner einen hat. Und Sie brauchen keine Ausnahmebehandlung.

  Scanner scanner = new Scanner(System.in); int n1 = 0, n2 = 0; boolean bError = true; while (bError) { if (scanner.hasNextInt()) n1 = scanner.nextInt(); else { scanner.next(); continue; } if (scanner.hasNextInt()) n2 = scanner.nextInt(); else { scanner.next(); continue; } bError = false; } System.out.println(n1); System.out.println(n2); 

Javadoc des Scanners

Wenn ein Scanner eine “InputMismatchException” austriggers, übergibt der Scanner das Token, das die Ausnahme verursacht hat, nicht, sodass er über eine andere Methode abgerufen oder übersprungen werden kann.

Sie können auch Folgendes versuchen

  do { try { System.out.println("Enter first num: "); n1 = Integer.parseInt(input.next()); System.out.println("Enter second num: "); n2 = Integer.parseInt(input.next()); nQuotient = n1/n2; bError = false; } catch (Exception e) { System.out.println("Error!"); input.reset(); } } while (bError); 

eine weitere Option ist die Definition von Scannereingang = neuer Scanner (System.in); Innerhalb des Versuchsblocks wird jedes Mal ein neues Objekt erstellt, wenn Sie die Werte erneut eingeben müssen.

Um der Antwort von debobroto das zu folgen, können Sie auch danach setzen

 input.reset(); input.next(); 

Ich hatte das gleiche Problem und als ich das versuchte. Es hat es komplett repariert.

Da die bError = false statement im try block nie erreicht wird und die statement für die eingegebene statement bError = false sie den Fehler in der Endlosschleife .

Versuchen Sie es auf diese Weise mit hasNextInt()

 catch (Exception e) { System.out.println("Error!"); input.hasNextInt(); } 

Oder versuchen Sie es mit nextLine() gekoppelt mit Integer.parseInt() für die Eingabe ….

 Scanner scan = new Scanner(System.in); int num1 = Integer.parseInt(scan.nextLine()); int num2 = Integer.parseInt(scan.nextLine()); 

Zur Ergänzung der AmitD-Antwort:

Kopieren Sie einfach Ihr Programm und fügen Sie es ein:

 Error! Enter first num: .... infinite times .... 

Wie Sie sehen können, die statement:

 n1 = input.nextInt(); 

Wirft fortwährend die Exception, wenn Ihre doppelte Nummer eingegeben wird, und das ist, weil Ihr Stream nicht gelöscht wird. Um es zu beheben, folgen Sie der Antwort von AmitD.

@Limp, deine Antwort ist richtig, benutze einfach .nextLine () beim Lesen der Eingabe. Beispielcode:

  do { try { System.out.println("Enter first num: "); n1 = Integer.parseInt(input.nextLine()); System.out.println("Enter second num: "); n2 = Integer.parseInt(input.nextLine()); nQuotient = n1 / n2; bError = false; } catch (Exception e) { System.out.println("Error!"); } } while (bError); System.out.printf("%d/%d = %d", n1, n2, nQuotient); 

Lesen Sie die Beschreibung, warum dieses Problem in dem folgenden Link verursacht wurde. Suchen Sie nach der Antwort, die ich für das Detail in diesem Thread veröffentlicht habe. Java Homework Benutzereingabe Problem

Ok, ich werde es kurz beschreiben. Wenn Sie Eingabe mit nextInt () lesen, lesen Sie nur den Zahlenteil, aber das ENDLINE-Zeichen war immer noch im Stream. Das war der Hauptgrund. Schauen Sie sich den Code oben an. Ich habe nur die ganze Zeile gelesen und analysiert. Sie triggers immer noch die Ausnahme aus und funktioniert so, wie Sie es erwartet haben. Rest deines Codes funktioniert gut.