In Java werden Ausnahmen in checked (überprüfte) und unchecked (nicht überprüfte) unterteilt.
Exception, aber nicht von RuntimeException. Der Compiler verlangt eine explizite Behandlung mit try-catch oder eine Deklaration in throws.RuntimeException. Der Compiler verlangt keine zwingende Behandlung.public void readFile(String file) throws IOException { /* ... */ } // checked public void divide(int a, int b) { int res = a/b; } // unchecked (ArithmeticException)
Der Hauptunterschied besteht darin, dass checked Exceptions für vorhersehbare, behandelbare Situationen verwendet werden (z.B. Eingabe-/Ausgabefehler), während unchecked Exceptions für Programmfehler oder kritische Situationen verwendet werden, von denen man sich nicht erholen kann (z.B. NullPointerException).
Frage: Muss eine unchecked Exception behandelt oder in throws deklariert werden, wenn Ihre Methode sie auslösen kann?
Antwort: Nein. Der Compiler verlangt nicht, dass nicht behandelbare (unchecked) Ausnahmen überprüft oder deklariert werden. Ihre Behandlung liegt in Ihrem Ermessen; Sie können try-catch verwenden, aber meist ist es besser, sie "fallen zu lassen", bis zum globalen Handler.
public void foo() { throw new IllegalArgumentException(); } // Erfordert keine Behandlung oder Erklärung
Geschichte
In einem Bank-API-Projekt wurden bei der Behandlung von Eingabe-/Ausgabefehlern
RuntimeExceptionstatt checked geworfen. Infolgedessen waren die Kunden nicht gezwungen, sie zu behandeln, was zu falschem Verhalten bei Verlust der Verbindung zum Server führte, und die Anwendung "stürzte" ab, ohne den Benutzer zu informieren.
Geschichte
Ein Entwickler hat eine übermäßige Anzahl von
throws Exceptionin den Methodensignaturen (z.B. für Datenbanken) deklariert, was dazu führte, dass alle verwendeten Methoden entweder try-catch oder ebenfalls throws verwenden mussten. Dies führte zu unübersichtlichem Code, verschlechterte die Lesbarkeit und erschwerte das Refactoring.
Geschichte
In einem der Mikrodienste wurden alle Ausnahmen mit einem allgemeinen
catch (Exception e)gefangen. Dies schnappte auch unchecked Exceptions (z.B.NullPointerException) auf, was zu "stillem" Ignorieren kritischer Fehler führte – der Dienst arbeitete mit inkorrekten Daten.