Bezieht sich auf einige Probleme, die während der Programmausführung auftreten.
Es gibt verschiedene Typen, z. B., aber die vom Benutzer verwendete Software stoppt nicht, funktioniert nicht mehr oder wird auch dann nicht normal verarbeitet, wenn ein Problem auftritt. Unterlassen Sie. Daher müssen Programmierer ** "im Notfall programmieren **", um mit verschiedenen Situationen fertig zu werden. Man kann sagen, dass diese Ausnahmebehandlung eine entsprechende Rolle spielt.
try、catch、finally
Schließen Sie die Verarbeitung, die eine Ausnahme verursachen kann, in einen try-Block ein und beschreiben Sie die Verarbeitung, wenn eine Ausnahme im catch-Block auftritt, der auf den try-Block folgt.
try Im try-Block können mehrere Anweisungen geschrieben werden. Wenn eine Ausnahme auftritt, wird die nachfolgende Verarbeitung im try-Block übersprungen ** und die Steuerung wird sofort auf den entsprechenden catch-Block übertragen. Sobald die Steuerung auf den Catch-Block übertragen wurde, wird die nachfolgende Try-Block-Verarbeitung unabhängig von der Notwendigkeit nicht ausgeführt.
catch Der catch-Block ist ein Block zur Beschreibung der Verarbeitung, wenn eine Ausnahme auftritt. ** Der Zweck des catch-Blocks besteht darin, das Programm in den normalen Zustand zurückzusetzen **. Wenn die Verarbeitung dieses Blocks abgeschlossen ist, "wurde das Problem behoben und der normale Betrieb wiederhergestellt. Da für jeden aufgetretenen Ausnahmetyp mehrere Fangblöcke beschrieben werden können, kann der Behandlungsprozess für jeden Ausnahmetyp geändert werden.
Es ist auch möglich, den Fangblock wegzulassen. Das Weglassen des catch-Blocks ist ein Fall, in dem die Ausnahmebehandlungsmethode innerhalb der Methode nicht bestimmt werden kann.
Wenn Sie mehrere Catch-Blöcke vorbereiten, ** Wenn Sie Code schreiben, der von keinem Ausnahmemuster erreicht werden kann, generiert der Compiler einen Kompilierungsfehler. ** ** **
[Beispiel eines nicht erreichbaren Falls]
SampleException
public class SampleException extends Exception{}
SubSampleException
public class SubSampleException extends SampleException{}
Main
public class Main {
public static void main(String[] args) {
try {
sample();
sub();
} catch (SampleException e) {
System.out.println("A");
} catch (SubSampleException e) {
System.out.println("B");
}
}
private static void sample() throws SampleException {
throw new SampleException();
}
private static void sub() throws SubSampleException{
}
Hauptmethode Rufen Sie die sample () -Methode in der ersten Zeile des try-Blocks auf → catch (SampleException e) {} Empfängt den Block und führt den im Block beschriebenen Verarbeitungsinhalt aus.
Rufen Sie in der zweiten Zeile der Hauptmethode die Methode sub () auf → ** catch (SampleException e) {} Block ** empfängt und führt den im Block beschriebenen Verarbeitungsinhalt aus. Fangen Sie mit der Superklasse SampleException ab, bevor Sie SubSampleException erreichen.
Deshalb,
[Ausgabeergebnis] A A
Das ist das Ergebnis.
SubSampleException wird durch Aufrufen der sub () -Methode in der zweiten Zeile des try-Blocks ausgelöst. Da die SampleException-Klasse jedoch eine Oberklasse der SubSampleException-Klasse ist, kann der SampleException-Block diese Ausnahme auch abfangen. Daher wird die Verarbeitung in dem Block ausgeführt, der von der zuvor geschriebenen SampleException-Klasse empfangen wurde, bevor der Block die Ausnahme von SubSampleException empfängt.
In einem solchen Fall wird festgestellt, dass der catch-Block in SubSampleException nicht erreichbarer Code ist, und der Compiler löst einen Kompilierungsfehler aus.
finally
Unabhängig davon, ob eine Ausnahme auftritt oder nicht, existiert der auszuführende Prozess unabhängig von der Form des Programms. Der finally-Block beschreibt die Verarbeitung, die Sie ausführen möchten, unabhängig davon, ob eine Ausnahme aufgetreten ist oder nicht.
Wenn der finally-Block beschrieben wird und keine Ausnahme auftritt, wird der im finally-Block beschriebene Prozess ausgeführt, nachdem der try-Block ausgeführt wurde. Wenn eine Ausnahme auftritt, wird die Steuerung vom try-Block zum catch-Block übertragen, und dann wird der finally-Block ausgeführt.
Der finally-Block dient zur Beschreibung des Prozesses, den Sie ausführen möchten, unabhängig davon, ob eine Ausnahme aufgetreten ist. Dies gilt auch dann, wenn er im ** catch-Block zurückgegeben wird und die Steuerung an die aufrufende Methode zurückgibt. Vorher wird der finally-Block immer ausgeführt. ** ** **
Der finally-Block muss nicht nach Ausnahmetyp getrennt werden.
Der finally-Block wird nicht nur ausgeführt **, wenn die System.exit-Methode im try-Block oder catch-Block aufgerufen wird, um die Anwendung zwangsweise zu beenden, oder wenn die JVM oder das Betriebssystem abstürzt **.
→ Daher kann die Reihenfolge nicht wie "catch-try-finally" und "try-finally-catch" geändert werden.
sample
public class Main {
public static void main(String[] args) {
try {
try {
String[] array = { "A", "B", "C" };
System.out.println(array[3]); //①
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("D"); //②
} finally {
System.out.println("E"); //③
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("F");
} finally {
System.out.println("G"); //④
}
}
}
Wenn mehrere try-catch auf diese Weise verschachtelt sind, ist es ** der nächste catch-Block, der der Ausnahme entspricht, die die ausgelöste Ausnahme empfängt. ** ** **
Also im obigen Code, (1) Da versucht wurde, den vierten Wert für ein Array-Array auszugeben, das nur drei Werte im try-Block enthält, wurde die Steuerung auf den cacth-Block übertragen. (2) Nach der Verarbeitung mit dem nächsten Fangblock, der der in (1) aufgetretenen Ausnahme entspricht. ③ Führen Sie die Verarbeitung im inneren finally-Block durch. ④ Schließlich blockiert das Äußere schließlich Prozesse.
Es wird der Fluss. Zu diesem Zeitpunkt wird der ** finally-Block immer ausgeführt, sodass sowohl der innere als auch der äußere finally-Prozess ausgeführt werden. ** ** **
Die Java-Ausnahmeverarbeitung umfasst die Verarbeitung "throw" und "throw". Beide bedeuten "werfen" den Prozess, aber der Inhalt ist sehr unterschiedlich.
throw Lösen Sie absichtlich eine Ausnahme aus, um die Ausnahme zu behandeln. ** Beschreiben Sie in der Methode. ** ** **
example
void sample (int num) {
if(num < 0) {
throw new IllegalArgumentException("Negative Werte können nicht verwendet werden.");
}
}
throws Ausnahmen, die in einer Methode auftreten, werden nicht in der ** eigenen Methode verarbeitet, sondern vom Aufrufer der Methode behandelt. ** ** ** Die Ausnahmeverarbeitung wird in der Methode, in die Würfe geschrieben werden, nicht beschrieben, und die Ausnahmeverarbeitung wird in der Methode auf der Seite ausgeführt, die die Methode aufgerufen hat, in der Würfe geschrieben werden.
example
public static void sample() throws IOException{
FileWriter fw = new FileWriter("data.txt");
}
FileWriter ist eine einfache Klasse zum Schreiben von Zeichendateien. Wenn Sie sie nicht mit der try-catch-Anweisung abfangen, führt dies zu einem Kompilierungsfehler ** Ausnahme prüfen **, sodass Sie bei der Verarbeitung eine try-catch-Anweisung schreiben müssen. Durch die Beschreibung von Würfen lässt der Aufrufer der Methode sie jedoch korrespondieren.
Es gibt zwei Haupttypen von Problemen, die während der Programmausführung in Java auftreten.
Es gibt zwei.
Ausnahmen werden weiter in aktivierte und nicht aktivierte Ausnahmen unterteilt.
Java basiert auf aktivierten Ausnahmen, um zu verhindern, dass Programmierer vergessen, die Ausnahmebehandlung zu schreiben. In der Geschichte der Software, die riesig und kompliziert wurde, hat die Anzahl der Fehler, die Programmierer vergessen, die Ausnahmebehandlung zu beschreiben, zugenommen, und der Hintergrund ist, dass die automatische Überprüfungsfunktion des Compilers aus der Reflexion übernommen wurde, die den Fehler verursacht hat. ..
Java-Ausnahmeklassen sind grob unterteilt
Es ist in eine aktivierte Ausnahme und eine nicht aktivierte Ausnahme unterteilt und stellt einen Fehler dar.
Alle Unterklassen der Exception-Klasse sind geprüfte Ausnahmen, mit Ausnahme von ** RuntimeException und seinen Unterklassen. ** ** ** Aus diesem Grund müssen Ausnahmeklassen, die von der Ausnahmeklasse erben, entweder try-catch oder deklarieren in der throw-Klausel. Andererseits werden ** RuntimeException und ihre Unterklassen als ungeprüfte Ausnahmen behandelt, selbst wenn sie Unterklassen von Exception sind. ** (RuntimeException ist eine Unterklasse von Exception) Daher sind RuntimeException und ihre Unterklassen nicht gezwungen, try-catch durchzuführen. Natürlich können Sie einen Try-Catch schreiben, ohne dazu gezwungen zu werden. Außerdem spielen ** nicht aktivierte Ausnahmen keine Rolle, wenn sie nicht in der throw-Klausel deklariert sind. ** ** **
Der Fehler wird durch die Fehlerklasse dargestellt, aber ** es ist die tatsächlich verwendete Unterklasse. ** ** ** Zu den von Error geerbten Unterklassen gehören beispielsweise OutOfMemoryError, NoClassDefFoundError und StackOverflowError. Um als ** Fehler klassifiziert zu werden, ist es außerdem erforderlich, Fehler zu erben. ** ** ** Wenn diese Probleme auftreten, erstellt die JVM eine Instanz der entsprechenden Fehlerunterklasse und benachrichtigt das Programm. Dies ist der gleiche Mechanismus wie bei Ausnahmen, aber ** Fehler müssen im Gegensatz zu Ausnahmen nicht "programmiert" werden. ** Daher ist es nicht erforderlich, zu versuchen, mit Würfen zu fangen oder zu deklarieren. (Es ist nur "nicht erforderlich" und kann bei Bedarf abgefangen und verarbeitet werden.)
――Welche Ausnahmen unterstützt jede Klasse?
Für etc.
Java SE 8 API-Spezifikation https://docs.oracle.com/javase/jp/8/docs/api/ Sie können die Details von überprüfen.
Recommended Posts