Java Uncorved Execptions <BR /> Bevor Sie lernen, Ausnahmen in einem Programm zu bewältigen, ist es vorteilhaft zu sehen, was passiert, wenn Sie nicht umgehen. Das folgende Applet enthält einen Ausdruck, der absichtlich einen Null-Divid-Fehler verursacht.
Klasse exc0 {public static void main (String args []) {int d = 0;
Wenn das Java -Laufzeitsystem über die Situation überprüft wird, die durch Null geteilt wird, erstellt es ein neues Ausnahmebobjekt und wirft die Ausnahme aus. Dies führt dazu, dass die Ausführung von EXC0 aufhört, da eine Ausnahme, sobald sie ausgelöst ist, von einem Ausnahmehandler erfasst und sofort verarbeitet werden muss. In diesem Beispiel bieten wir keine unserer eigenen Ausnahmebehandler an, sodass die Ausnahme vom Standard -Handler des Java -Laufzeitsystems erfasst wird. Jede Ausnahme, die nicht von Ihrem Programm erfasst wird, wird schließlich vom Standard -Handler behandelt. Der Standardhandler zeigt eine Zeichenfolge an, die die Ausnahme beschreibt, die Stapelverfolgung, in der die Ausnahme eintritt, druckt und das Programm beendet.
Hier ist die Ausgabe, die vom Standard -Javajdk -Laufzeit -Interpreter erzeugt wird, um das Programm auszuführen:
java.lang.arithmeTexception: / bis null bei exc0.main (exc0.java:4)
Beachten Sie, wie der Klassenname Exc0, der Main für Methodenname, Dateiname exc0.java und Zeilennummer 4 in einer einfachen Stapelnutzungsspur enthalten sind. Beachten Sie außerdem, dass der geworfene Ausnahmetyp eine Unterklasse ausnahmslos ist, die als Arithelexception bezeichnet wird und die Art von Fehlermethode deutlicher beschreibt. Später in diesem Kapitel diskutieren Java mehrere integrierte Ausnahmetypen, die verschiedene Arten von Laufzeitfehlern entsprechen, die möglicherweise generiert werden.
Der Stack -Track zeigt die Abfolge von Methodenaufrufen an, die zum Fehler geführt haben. Beispielsweise ist hier eine andere Version des vorherigen Programms, die denselben Fehler einführt, der Fehler wird jedoch in einer anderen Methode als der Main () -Methode generiert:
Klasse exc1 {statische void subroutine () {int d = 0;
Die Stack -Track -Ergebnisse des Standard -Ausnahme -Handlers zeigen, wie der gesamte Anrufstack angezeigt wird:
java.lang.arithmeTexception: / bis null bei exc1.subroutine (exc1.java:4) bei exc1.main (exc1.java:7)
Wie Sie sehen können, ist der Boden des Stapels Zeile 7 von Main, die die Subroutine () -Methode nennt. Diese Methode verursacht eine Ausnahme in Zeile 4. Der Anrufstapel ist wichtig für das Debuggen, da er die genauen Schritte, die zum Fehler führen, feststellt.
Nisting von Java -Versuchsaussagen
Versuchen Sie, Aussagen können verschachtelt werden. Das heißt, eine Versuchsanweisung kann sich in einem anderen Try -Block befinden. Jedes Mal, wenn Sie eine Versuchserklärung eingeben, werden die Ausnahme vor und nach den Beziehungen auf den Stapel gedrängt. Wenn eine interne Try -Anweisung keinen Fanghandler mit besonderen Ausnahmen enthält, wird der Stapel angezeigt, und der Fangbehandler der nächsten Versuchserklärung prüft, ob er mit ihm übereinstimmt. Dieser Vorgang wird fortgesetzt, bis eine Catch -Erklärung erfolgreich übereinstimmt oder bis alle verschachtelten Versuchsaussagen erschöpft sind. Wenn keine Catch -Anweisung übereinstimmt, wird das Java -Laufzeitsystem diese Ausnahme behandeln. Hier ist ein Beispiel für die Verwendung von verschachtelten Versuchsaussagen:
// Ein Beispiel für verschachtelte Aussagen. Class Nesttry {public static void main (String args []) {try {int a = args.Length; Divide-By-Zero-Ausnahme. Divide-By-Zero-Ausnahme wird durch den folgenden Code generiert. OU T-OF-BOUNDS AUSBARE. e) {System.out.println ("Array Index Out-of-Bounds:" + e);
Wie Sie sehen können, nistet das Programm einen weiteren Try -Block in einem Try -Block. Das Programm funktioniert wie folgt: Wenn Sie das Programm ohne Befehlszeilenparameter ausführen, generiert der Außenblock eine Ausnahme, die durch Null geteilt wird. Das Programm wird unter einer Befehlszeilenparameterbedingung ausgeführt, und ein durch einen verschachtelten Try Block geteiltes Fehler führt zu einem teilbaren Fehler. Da der innere Block nicht mit dieser Ausnahme übereinstimmt, übergibt er die Ausnahme an den äußeren Try -Block, in dem die Ausnahme verarbeitet wird. Wenn Sie das Programm mit zwei Befehlszeilenparametern ausführen, wird eine Array -Grenzausnahme durch den internen Try -Block generiert. Die folgenden Ergebnisse veranschaulichen jeden Fall:
C:/> java nesttrydivide von 0: java.lang.arithmeTexception:/by zeroc:/> java nesttry onea = 1Divide von 0: java.lang.arithmeTexception:/by Zeroc:/> java nesttry One Twoa = 2Array Index Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out-Out- OF-Bounds: Java.lang.ArrayIndexoutofBoundSexception
Wenn es einen Methodenaufruf gibt, kann die Verachtung von Versuchsanweisungen sehr heimlich erfolgen. Beispielsweise können Sie eine Methode in einem Try -Block aufrufen. In dieser Methode gibt es eine andere Versuchserklärung. In diesem Fall ist der Versuch in der Methode immer noch im Try -Block verschachtelt, der die Methode extern aufruft. Das Folgende ist eine Modifikation des vorherigen Beispiels, und die verschachtelten Tryblöcke werden in die Innenseite der Methode Nesttry () verschoben:
/* Versuchen Sie Aussagen können implizit durch Aufrufe zu Methoden verschachtelt werden. -Null wird durch den folgenden Code generiert. F-Bounds-Ausnahme. .out .println ("Array Index Out-of-Bounds:" + E); PREEN, die folgende Aussage erzeugt eine Ausnahme von Divide-by-Zero. * / int B = 42 / A; ) {System.
Die Ausgabe dieses Programms ist der gleiche wie im vorherigen Beispiel.