Heim >Java >javaLernprogramm >Wie vermeide ich Endlosschleifen bei der Behandlung von InputMismatchException in Java?

Wie vermeide ich Endlosschleifen bei der Behandlung von InputMismatchException in Java?

Linda Hamilton
Linda HamiltonOriginal
2024-12-08 06:56:111037Durchsuche

How to Avoid Infinite Loops When Handling InputMismatchException in Java?

Try/Catch mit InputMismatchException: Eliminierung einer Endlosschleife

Problem aufgetreten

In einem Programm, das ganzzahlige Eingaben vom Benutzer liest, unter Verwendung eines Try/ Catch-Block zur Behandlung ungültiger Einträge enthält, tritt eine Endlosschleife auf, wenn eine InputMismatchException ausgelöst wird (z. B. wenn der Benutzer eine eingibt). nicht ganzzahliges Zeichen).

Ursache der Endlosschleife

Die Endlosschleife wird durch zwei Probleme verursacht:

  1. Fehlende Eingabebereinigung: Wenn eine InputMismatchException ausgelöst wird, wird das eingegebene Token nicht aus dem Eingabestream verbraucht. Es bleibt im Stream, was dazu führt, dass nachfolgende Leseversuche die Ausnahme wiederholt auslösen.
  2. Allgemeine Ausnahmebehandlung: Der Catch-Block des Try/Catch ist derzeit auf Catch (Ausnahme e) eingestellt. Diese umfassende Behandlung umfasst alle Ausnahmen, die für die InputMismatchException, die wir behandeln müssen, nicht spezifisch genug ist.

Lösung

Um die Endlosschleife zu beheben und die korrekte Behandlung von InputMismatchException sicherzustellen, sind mehrere Schritte erforderlich kann genommen werden:

  1. Verbrauchen Sie die fehlerhafte Eingabe:Nach dem Abfangen der InputMismatchException konsumiert explizit das Eingabetoken, um zu verhindern, dass es wiederholte Ausnahmen verursacht. Dies kann durch den Aufruf von input.next(); erfolgen. innerhalb des Catch-Blocks.
  2. Spezifische Ausnahmebehandlung verwenden: Ersetzen Sie den Catch (Ausnahme e) durch den Catch (InputMismatchException e), um nur InputMismatchExceptions speziell zu behandeln.
  3. Validierung implementieren: Darüber hinaus ist es ratsam, die Methode scanner.hasNextInt() zu verwenden, um zu überprüfen, ob die Die Eingabe ist eine Ganzzahl, bevor versucht wird, sie zu lesen. Dadurch können Ausnahmen insgesamt vermieden werden.

Hier ist der geänderte Code mit den vorgeschlagenen Verbesserungen:

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(); // Consume the erroneous input
            }
        } while (bError);

        System.out.printf("%d/%d = %d",n1,n2, nQuotient);
    }
}

Das obige ist der detaillierte Inhalt vonWie vermeide ich Endlosschleifen bei der Behandlung von InputMismatchException in Java?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn