Try/Catch-Block mit InputMismatchException, der eine Endlosschleife verursacht
In einem Java-Programm, das ganzzahlige Eingaben vom Benutzer akzeptieren soll, ein Try/Catch Der Block wird verwendet, um ungültige Eingaben zu verarbeiten. Der folgende Code stößt jedoch auf eine Endlosschleife, wenn der Benutzer einen nicht ganzzahligen Wert eingibt, insbesondere InputMismatchException.
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); } }
Um zu verstehen, warum dies geschieht, ist es wichtig, das Verhalten der Scanner-Klasse zu untersuchen, wenn eine InputMismatchException auftritt . Nach dem Auslösen der Ausnahme verwirft der Scanner die ungültige Eingabe nicht. Stattdessen verbleibt es im Eingabestream und verursacht möglicherweise eine Endlosschleife innerhalb des try/catch-Blocks.
Die Lösung besteht darin, input.next() explizit innerhalb des Catch-Blocks aufzurufen, um das ungültige Token zu verwerfen. Darüber hinaus wird empfohlen, hasNextInt() zu verwenden, um zu prüfen, ob eine gültige Ganzzahl verfügbar ist, bevor die Eingabe akzeptiert wird.
Der korrigierte Code unten folgt diesen Empfehlungen:
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 (InputMismatchException e) { System.out.println("Error!"); input.next(); // Discard the invalid token } } while (bError); System.out.printf("%d/%d = %d", n1, n2, nQuotient); } }
Durch die Einbeziehung dieser Änderungen wird die Der try/catch-Block behandelt InputMismatchException effektiv und stellt sicher, dass das Programm nicht in eine Endlosschleife gerät, wenn der Benutzer ungültige Eingaben eingibt.
Das obige ist der detaillierte Inhalt vonWarum verursacht ein Try-Catch-Block mit InputMismatchException eine Endlosschleife in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!