(I) Ausnahmehierarchie von Java
Um den Unterschied zwischen der geprüften Ausnahme und der deaktivierten Ausnahme in Java zu verstehen, schauen wir uns zunächst die Ausnahmehierarchie von Java an.
Dies ist ein vereinfachtes Java -Ausnahmehierarchie -Diagramm. Es ist zu beachten, dass alle Klassen von Throwable geerbt werden und die nächste Schicht in zwei Strukturen unterteilt ist, Fehler und Ausnahme. Die Fehlerklassenstufe beschreibt interne Fehler und Erschöpfungsfehler der Ressourcen im Java -Laufzeitsystem. Zusätzlich zur einfachen Berichterstattung über diesen Fehler dem Benutzer und der Versuch, das Programm sicher zu beenden, gibt es im Allgemeinen andere Lösungen.
(Ii) der Unterschied zwischen ungeprüfter Ausnahme und überprüfter Ausnahme
Schauen wir uns nach dem Verständnis der oben genannten Ausnahme an, was eine geprüfte Ausnahme und die deaktivierte Ausnahme ist. Tatsächlich definiert die Java -Sprachspezifikation diese beiden sehr einfachen. Ausnahmen aus Fehler oder RunTimeException werden als nicht überprüfte Ausnahmen bezeichnet, und alle anderen Ausnahmen werden überprüfte Ausnahmen . Obwohl diese Definition sehr einfach ist, ist RunTimeException ein sehr verwirrendes Konzept. Es scheint, dass alle unsere Ausnahmen dabei sind, das Programm auszuführen. Meine Erklärung von rus timeexception in effektivem Java ist nicht so zufriedenstellend.
Verwenden Sie überprüfte Ausnahmen für wiederherstellbare Bedingungen und Laufzeitausnahmen für Programmierfehler (Punkt 58 in der 2. Auflage).
Aus diesem Satz können wir ihn jedoch einfach erweitern, dh wenn eine RunTimeException auftritt, muss es für den Programmierer selbst ein Problem sein. Beispielsweise sind Array -Index -Einweisungen außerhalb der Grenzen und greifen auf Null -Zeiger -Ausnahmen usw. zu, solange Sie ein wenig Aufmerksamkeit schenken, sind diese Ausnahmen Ausnahmen, die in der Codierungsstufe vermieden werden können. Wenn Sie immer noch der Meinung sind, dass diese beiden Konzepte schwer zu unterscheiden sind, besteht die "gewalttätigste" Methode darin, die gemeinsame RunTimeException auswendig zu merken, die viel Zeit zum Richten sparen kann.
(Iii) Warum sollten wir zwischen ungeprüften Ausnahmen und überprüften Ausnahmen unterscheiden?
Der Grund ist eigentlich sehr einfach. Der Compiler prüft, ob Sie einen Ausnahmebehandlungsmechanismus für alle überprüften Ausnahmen bereitstellen. Wenn wir beispielsweise Class.forname () verwenden, um das Klassenobjekt einer bestimmten Zeichenfolge zu finden, wird die Zusammenstellung nicht übergeben, wenn die Ausnahmebehandlung nicht für diese Methode bereitgestellt wird.
(Iv) Welche Ausnahmen sollten wir erklären?
Wie bereits erwähnt, ist RunTimeException ein Fehler, der während des Programmierungsprozesses vermieden werden kann. Müssen wir diese Ausnahmen nicht werfen? Im Prinzip ist dies wahr, aber die Java -Spezifikation schränkt dies nicht ein. Es scheint nur, dass Sie ein Array aus den Grenzen werfen und es keine praktische Bedeutung gibt, und im Gegenteil, es wird bestimmte Leistungsverluste verursachen. Wie sollen wir also Ausnahmen werfen? Wir müssen uns daran erinnern, dass die folgenden zwei Situationen erforderlich sind, um Ausnahmen zu deklarieren:
Rufen Sie eine Methode der überprüften Ausnahme an, wie z. B. IOException. Wie aus diesem Grund haben wir früher diskutiert, wenn alle überprüften Ausnahmen geworfen werden, kann sie nicht kompiliert werden. Während des Programms wurde ein Fehler gefunden und eine Ausnahme mit der Wurfanweisung ausgelöst. Für nicht überprüfte Ausnahmen gibt es nur zwei Hauptsituationen: entweder vermeidbar (Laufzeitausnahme) oder unkontrollierbar. Diese erfordern auch eine Ausnahmeerklärung.
Hier sind Beispiele, um die in Anmerkung 2 oben genannten unangenehmen Dinge zu veranschaulichen:
Definieren Sie zunächst eine grundlegende Ausnahmeklasse GenerationXception, die aus der Ausnahme erbelt wurde.
Paket check_inchecked_exceptions; public class genericexception erweitert die Ausnahme { / ** * * / private statische endgültige long serialversionuid = 2778045265121433720L; public genericexception () {} public genericexception (String msg) {Super (msg); }} Im Folgenden definiert eine Testklasse VerifyException.
Paket check_inchecked_exceptions; public class verifyException {public void first () löscht genericexception {neue genericexception ("Checked Exception"); } public void Second (String msg) {if (msg == null) {neue nullPointerexception ("Unkontrollierte Ausnahme"); }} public void dritter () löscht GenerationXception {first (); } public static void main (String [] args) {verifyException ve = new verifyException (); try {ve.first (); } catch (genericexception e) {e.printstacktrace (); } ve.second (null); }}Ermitteln Sie nach dem Laufen die folgenden Informationen zur Konsole von Eclipse:
check_inchecked_exceptions.genericexception: Checked Exception
AT check_inchecked_exceptions.verifyException.first (verifyException.java:6)
bei check_inchecked_exceptions.verifyException.main (verifyException.java:23)
Ausnahme im Thread "Haupt" java.lang.nullpointerexception: Unkontrollierte Ausnahme
bei check_inchecked_exceptions.verifyException.second (verifyException.java:11)
at check_inchecked_exceptions.verifyException.main (verifyException.java:29)
In dem obigen Beispiel ist ersichtlich, dass die Ausnahme der Elternklasse mit den Konzepten von Checked und Decuped in Kombination des überprüften Typs, aber die RunTimeException von Unterklassen (Unterklasse NullPointerexception) ist, ist nicht überprüft.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.