Heim  >  Artikel  >  Java  >  Wie verwende ich JVM, um Java-Ausnahmen abzufangen? (mit Beispielen)

Wie verwende ich JVM, um Java-Ausnahmen abzufangen? (mit Beispielen)

不言
不言nach vorne
2019-03-19 09:31:332593Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Frage, wie man mit JVM Java-Ausnahmen abfängt. (Mit Beispielen) hat es einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen.

1. Zwei Schlüsselfaktoren von Ausnahmen

(1) Auslösen von Ausnahmen
1. Verwenden Sie insbesondere throw, um eine Ausnahme auszulösen
2. Implizit: Die Java Virtual Machine löst automatisch eine Ausnahme

für Code aus, der nicht ausgeführt werden kann (empfohlen: Java-Tutorial )

(2) Ausnahmen abfangen
1. Codeblock ausprobieren: Wird zum Markieren von Code verwendet, der eine Ausnahmeüberwachung erfordert.
2.Catch-Codeblock: Folgt dem Try-Codeblock und wird verwendet, um eine bestimmte Art von Ausnahme abzufangen, die im Try-Codeblock ausgelöst wird. Der Catch-Block deklariert nicht nur den Typ der abgefangenen Ausnahme, sondern definiert auch einen Ausnahmehandler für diesen Ausnahmetyp. In Java können auf einen Try-Codeblock mehrere Catch-Codeblöcke folgen, um verschiedene Arten von Ausnahmen abzufangen. Die Java Virtual Machine gleicht Ausnahmehandler von oben nach unten ab. Daher kann der vom vorherigen Catch-Codeblock erfasste Ausnahmetyp den folgenden nicht abdecken, da der Compiler sonst einen Fehler meldet.
3.Finally-Codeblock: Nach dem Try-Codeblock und dem Catch-Codeblock wird er verwendet, um einen Codeabschnitt zu deklarieren, der ausgeführt werden muss. Es soll verhindern, dass bestimmte wichtige Bereinigungscodes übersprungen werden, beispielsweise das Schließen offener Systemressourcen. Bei normaler Programmausführung wird dieser Code nach dem Try-Block ausgeführt. Andernfalls, wenn der Try-Codeblock eine Ausnahme auslöst und die Ausnahme nicht abgefangen wird, wird der endgültige Codeblock direkt ausgeführt und löst die Ausnahme nach der Ausführung erneut aus. Wenn die Ausnahme von einem Catch-Block abgefangen wird, wird der Final-Block nach dem Catch-Block ausgeführt. In einigen unglücklichen Fällen löst der Catch-Block auch eine Ausnahme aus. Dann wird auch der Final-Block ausgeführt und löst die vom Catch-Block ausgelöste Ausnahme aus. Unter einigen äußerst unglücklichen Umständen löst der endgültige Codeblock auch eine Ausnahme aus, sodass Sie die Ausführung des aktuellen endgültigen Codeblocks unterbrechen und die Ausnahme auslösen müssen.

2. Klassifizierung von Ausnahmen

Wie verwende ich JVM, um Java-Ausnahmen abzufangen? (mit Beispielen)

1. Die übergeordnete Klasse aller Ausnahmen ist Throwable
2 Der Ausführungsstatus des Programms kann nicht wiederhergestellt werden. Es kann nur der Thread oder sogar die JVM beendet werden. 3. Ausnahme ist eine weniger schwerwiegende Ausnahme als Fehler
4. Sowohl die Laufzeitausnahme als auch der Fehler sind Ausnahmen, die dies nicht tun müssen überprüft werden
5. Mit Ausnahme von Runtime Exception und Error sind alle Check Exception-Ausnahmen Ausnahmen, die explizit abgefangen werden müssen

3 Ausnahmen für virtuelle Maschinen abfangen?

Es ist für die Java Virtual Machine sehr teuer, Ausnahmeinstanzen zu erstellen. Die virtuelle Maschine muss einen Stack-Trace der Ausnahme generieren. Dieser Vorgang greift nacheinander auf die Java-Stack-Frames des aktuellen Threads zu und zeichnet verschiedene Debugging-Informationen auf, einschließlich des Namens der Methode, auf die der Stack-Frame zeigt, des Klassennamens und Dateinamens der Methode sowie der Zeile im Code wo die Ausnahme ausgelöst wurde.

Können wir Ausnahmeinstanzen zwischenspeichern und bei Bedarf direkt auslösen, da die Erstellung von Ausnahmeinstanzen sehr teuer ist? Aus grammatikalischer Sicht ist dies zulässig. Der dieser Ausnahme entsprechende Stack-Trace ist jedoch nicht der Speicherort der throw-Anweisung, sondern der Speicherort der neuen Ausnahme.
Daher kann dieser Ansatz Entwickler dazu verleiten, den falschen Standort anzuvisieren. Aus diesem Grund entscheiden wir uns in der Praxis häufig dafür, neue Ausnahmeinstanzen auszulösen.

Ausnahmebehandler

1. Quelle: Jede Methode generiert beim Kompilieren eine Ausnahmetabelle. Jeder Eintrag in der Ausnahmetabelle stellt einen Ausnahmehandler dar. 2. Zusammensetzung:
(1) vom Zeiger zum Zeiger: Stellt den Bereich zum Abfangen von Ausnahmen dar, der den Bereich von Try darstellt.
(2)Zielzeiger: Stellt die Startposition des Prozessors dar, die die Startposition des Fangs ist.
(3)Ausnahmetyp abgefangen.
3. Ausnahmen abfangen
(1) Wenn das Programm eine Ausnahme auslöst, durchläuft die Java Virtual Machine alle Einträge in der Ausnahmetabelle von oben nach unten. Wenn der Indexwert des Bytecodes, der die Ausnahme auslöst, innerhalb des Überwachungsbereichs eines Ausnahmetabelleneintrags liegt, bestimmt die Java Virtual Machine, ob die ausgelöste Ausnahme mit der Ausnahme übereinstimmt, die der Eintrag abfangen möchte. Bei einer Übereinstimmung überträgt die Java Virtual Machine den Kontrollfluss an den Bytecode, auf den der Zielzeiger des Eintrags zeigt.
(2) Wenn alle Ausnahmetabelleneinträge durchlaufen werden und die Java Virtual Machine immer noch nicht mit einem Ausnahmehandler übereinstimmt, öffnet sie den Java-Stack-Frame, der der aktuellen Methode entspricht, und wiederholt die oben genannten Vorgänge im Aufrufer. Im schlimmsten Fall muss die Java Virtual Machine die Ausnahmetabelle aller Methoden im Java-Stack des aktuellen Threads durchlaufen.
4. Kompilierung des Final-Codes: Die aktuelle Version des Java-Compilers kopiert den Inhalt des Final-Codeblocks und platziert ihn in den Ausgängen aller normalen Ausführungspfade und abnormalen Ausführungspfade des Try-Catch-Codeblocks.

代码1:
Try{
Try block
} catch {
Catch block
} finally {
Finally block
}
代码2:
Try {
Try block
Finally block
} catch {
Catch block
Finally block
} finally{
Finally block
}
Code 1 ist unser Java-Code, Code 2 ist der kompilierte Java-Code.

Hinweis: Wenn der Catch-Block eine Ausnahme abfängt und eine weitere Ausnahme auslöst, welche Ausnahme wird schließlich abgefangen und erneut ausgelöst? Die Antwort ist Letzteres. Mit anderen Worten, die ursprüngliche Ausnahme wird ignoriert, was sich sehr nachteilig auf das Code-Debugging auswirkt.

5. Unterdrückte Ausnahme und syntaktischer Zucker von Java7

Angesichts des obigen Abschnitts, der die Catch-Ausnahme ignoriert, hat Java7 das Problem der unterdrückten Ausnahmebehandlung eingeführt. Die Verwendung ist jedoch immer noch sehr umständlich (keine Erfahrung,

).

Das obige ist der detaillierte Inhalt vonWie verwende ich JVM, um Java-Ausnahmen abzufangen? (mit Beispielen). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen