Wie üblich kannte ich die Java-Ausnahme nicht und habe sie zusammengefasst. Dieses Mal (was?) Werde ich einen Artikel als mein eigenes Memo schreiben.
Es gab verschiedene Definitionen von Ausnahmen, daher zitierte ich aus Referenz 1, S. 264.
Es gibt ungefähr zwei Arten von Problemen, die während der Programmausführung in Java auftreten. Fehler </ font>, der auf eine Situation hinweist, die das Programm nicht behandeln kann, z. B. Probleme in der Ausführungsumgebung, und Ausnahme </ font>, die das Programm behandeln kann Es gibt zwei.
Ausnahmen werden weiter in aktivierte und nicht aktivierte Ausnahmen unterteilt. Eine geprüfte Ausnahme </ font> ist eine Ausnahme, die der Compiler überprüft, um festzustellen, ob Sie eine Ausnahmebehandlung geschrieben haben. Die andere nicht aktivierte Ausnahme </ font> ist eine Ausnahme, die der Compiler nicht überprüft, um festzustellen, ob Sie eine Ausnahmebehandlung geschrieben haben.
Und das. Kurz gesagt, es kann in drei Teile geteilt werden. Darüber hinaus gibt es Ausnahmeklassen, die jeder Ausnahme entsprechen, und ihre Beziehungen sind wie folgt.
(Ich möchte auch eine Unterklasse einfügen)
Ausnahmeklassen, die von Exception erben, einer Klasse von geprüften Ausnahmen, müssen in einer try-catch- oder throw-Klausel deklariert werden. Die Inspektion bedeutet hier fangen oder werfen. Wenn Sie nicht nach aktivierten Ausnahmen suchen, wird ein Kompilierungsfehler angezeigt.
Selbst in der Unterklasse von Exception wird RuntimeException, wenn sie vererbt wird, als ungeprüfte Ausnahme behandelt, und die Verarbeitung wie Try-Catch wird unnötig. Natürlich gibt es kein Problem, auch wenn die Ausnahmeverarbeitung beschrieben wird.
Ausnahmen wie Speichermangel oder Fehler beim Lesen einer Datei. Wie bei nicht aktivierten Ausnahmen müssen Sie sich nicht mit Ausnahmen befassen.
① Fangausnahme Wenn Sie explizit eine Ausnahme auslösen, fügen Sie "throw" hinzu (nur Ausnahme prüfen? Validieren) Der Parameter des "catch" -Blocks ist "Throwable", sodass Sie alle Ausnahmen abfangen können.
try { //Schließen Sie eine Verarbeitung ein, die eine Ausnahme auslösen kann
throw new Exception();
} catch (Exception e) {
... //Wird behandelt, wenn während eines Versuchs eine Ausnahme auftritt
} finally {
//Mit oder ohne Ausnahme ausgeführt
}
(2) Verwenden Sie Würfe in der Methodendeklaration, die eine Ausnahme auslöst.
private void hogehoge() throws Exception {
throw new Exception();
}
Sie können mehrere Ausnahmeklassen angeben, die abgefangen werden sollen. Ich zitierte aus Referenz 2.
//Für Java 6 oder früher
try {
. . .
} catch (IOException ex) {
logger.log(ex);
throw ex;
} catch (SQLException ex) {
logger.log(ex);
throw ex;
}
//Für Java 7 oder höher
try {
. . .
} catch (IOException|SQLException ex) {
logger.log(ex);
throw ex;
}
Eine Methode, die eine aktivierte Ausnahme auslöst, führt zu einem Kompilierungsfehler, sofern sie nicht abgefangen oder erneut ausgelöst wird. .. ..
public void method() throws Exception {}
// case1
try {
method();
} catch (Exception e) { //Fehler ohne Fang
...
}
// case 2
public void method2() throws Exception { //Fehler, wenn nicht erneut ausgelöst
method();
}
Referenz 1 Zitiert aus S.349. Da "StirngIndexOutOfboundsException" auftritt, wenn "i = 1", wird die Schleifenverarbeitung von "i> 1" nicht ausgeführt.
String[] array = {"abcde", "fgh", "ijk"};
String[] array2 = new String[3];
int i = 0;
try {
for (String s: array) {
array2[i] = s.substring(1, 4);
i++;
}
} catch (Exception e) {
System.out.println("Error");
}
for (String s: array2) {
System.out.println(s);
}
//Ausführungsergebnis
//Fehlerausgabe aufgrund eines Fehlers
// bcd array2[0]
// null array2[1]
// null array2[2]
Wenn Sie die Methode überschreiben, die die Ausnahme auslöst, werden dieser Methode die folgenden Einschränkungen hinzugefügt (Referenz 3 S. 299 mit einigen Änderungen).
(1) Ist die Ausnahme, die von der Methode der Unterklasse ausgelöst werden kann, dieselbe wie die Ausnahme, die von der Methode der Oberklasse ausgelöst wird? (2) Unabhängig davon, welche Ausnahme die Superklassenmethode auslöst, kann die Unterklassenmethode sie als "RuntimeException" oder als Ausnahme dieser Unterklasse auslösen (sie kann als Laufzeitausnahme besiegt werden). ③ Nur weil eine Superklassenmethode eine Ausnahme auslöst, ist es nicht unbedingt erforderlich, sie in eine Unterklassenmethode zu werfen.
Geben Sie ein konkretes Beispiel (Referenz 3 zitiert aus S.300). Hier NG: Kompilierungsfehler.
class Super { void method() throws IOException {} }
class SubA { void method() } //OK Sie müssen keine Ausnahme auslösen
class SubB { void method() throws FileNotFoundException {} } //Einfügen einer Unterklasse von OK IOException
class SubC { void method() throws Exception {} } //Superklasse der NG IOException einwerfen
class SubD { void method() throws ClassNotFoundException {} } //Einwerfen einer Ausnahmeklasse, die nicht von NG IOException geerbt wurde
class SubE { void method() throws RuntimeException {} } //OK, ich besiege eine Laufzeitausnahme
Recommended Posts