Dieser Artikel bietet Ihnen eine detaillierte Einführung in die Java-Ausnahmebehandlung. Ich hoffe, dass er für Freunde hilfreich ist.
Sehen wir uns ein Beispiel und einige Wissenspunkte zur Java-Ausnahmebehandlung (Ausnahmebehandlung) an.
Sehen Sie sich das Programm unten an. Die Methode pleaseThrow akzeptiert eine Instanz von Exception und löst die Instanz einfach aus. Beim Aufruf dieser Methode habe ich dann eine Instanz von SQLException übergeben. Da der Aufruf von PleaseThrow in einen Try-Catch-Block eingeschlossen ist,
Frage: Kann die von der PleaseThrow-Methode ausgelöste SQLException erfolgreich abgefangen werden?
public class ExceptionForQuiz<t> { private void pleaseThrow(final Exception t) throws T { throw (T) t; } public static void main(final String[] args) { try { new ExceptionForQuiz<runtimeexception>().pleaseThrow(new SQLException()); } catch( final SQLException ex){ System.out.println("Jerry print"); ex.printStackTrace(); } } }</runtimeexception></t>
Antwort: Der obige Code weist einen Syntaxfehler auf und kann nicht kompiliert werden!
Lassen Sie es uns Schritt für Schritt analysieren.
Die Java-Klasse ExceptionForQuiz
Wenn ich die Klasse ExceptionForQuiz instanziiere, ist der übergebene Typparameter RuntimeException.
RuntimeException ist eine ungeprüfte Ausnahme in Java. Auch wenn eine RuntimeException ausgelöst werden kann, wenn eine Methode ausgeführt wird, müssen Entwickler sie nicht explizit im Code vor der Methode deklarieren.
Schauen Sie sich die Kommentare von JDK RuntimeException an und es ist ganz klar: Ungeprüfte Ausnahmen müssen NICHT in einer Methode oder Konstruktorklausel deklariert werden, wenn sie durch die Ausführung der Methode oder des Konstruktors ausgelöst werden können.
Der Autor Frank Yellin muss ein toller Kerl sein.
Da Generika ein in Java 1.5 eingeführtes Konzept sind, gibt es für Generika ein Konzept zum Löschen von Typen, d. h. Generika Die Informationen Existiert nur in der Code-Kompilierungsphase. Im kompilierten Code werden die Informationen zu Generika gelöscht. Wenn beispielsweise der Typparameterteil in der vorherigen generischen Klasse keine Obergrenze angibt und wie folgt geschrieben wird:
Der Einfachheit halber entfernen wir zunächst den Try-Catch-Block im Code.
Das Folgende ist der aus ExceptionForQuiz.class dekompilierte Code:
Aus der obigen Abbildung können wir ersehen, dass der generische Parameter RuntimeException der Methoden pleaseThrow und RayExceptionForQuiz gelöscht wurde. Der Ausnahmetyp, der von der pleaseThrow-Methode ausgelöst werden kann, wurde gelöscht und wird zur Ausnahme.
Verwenden Sie Javap, um den durch die Kompilierung generierten Bytecode zu beobachten. Sie können auch feststellen, dass der Typparameter RuntimeException gelöscht wurde:
Sehen Sie sich den zweiten rot hervorgehobenen Bereich an: Ausnahmen: Java werfen .lang. Ausnahme
Nun sehen wir uns an, welche Fehlermeldung der Compiler meldet: Nicht erreichbarer Catch-Block für SQLException. Diese Ausnahme wird beim Versuch nie ausgelöst Anweisungskörper .
Diese Fehlermeldung ist begründet, da der Ausnahmetyp gelöscht wurde, da die Deklaration der pleaseThrow-Methode jetzt nur noch werfen kann Ausnahmen vom Typ „Exception“, daher kann der Catch in Zeile 14 niemals eine Ausnahme vom Typ „SQLException“ empfangen, sodass der Compiler einen Fehler auslöst.
Wie kann dieser Compilerfehler behoben werden? Ändern Sie einfach die SQLException in Zeile 14 in RuntimeException.
Aber in diesem Fall wird zwar der Syntaxfehler behoben, die von der pleaseThrow-Methode ausgelöste SQLException kann jedoch nicht abgefangen werden und es wird ein Laufzeitfehler gemeldet:
Wie verwende ich die Catch-Anweisung, um die von PleaseThrow ausgelöste SQLException abzufangen? Ändern Sie RuntimeException in Zeile 14 in die Oberklasse aller Ausnahmen: Exception.
Erneut ausführen, dieses Mal liegt weder ein Syntaxfehler noch ein Laufzeitfehler vor: Die SQLException wurde von der Catch-Anweisung in Zeile 14 erfolgreich abgefangen.
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Java-Ausnahmebehandlung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!