Java-Ausnahmebehandlung?

0. Einleitung

Wie üblich kannte ich die Java-Ausnahme nicht und habe sie zusammengefasst. Dieses Mal (was?) Werde ich einen Artikel als mein eigenes Memo schreiben.

1. Was ist Ausnahmebehandlung?

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.

スライド1.PNG

(Ich möchte auch eine Unterklasse einfügen)

2. Grundlagen jeder Ausnahme

① Inspektionsausnahme

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.

** ② Deaktivierte Ausnahme **

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.

** ③ Fehler **

Ausnahmen wie Speichermangel oder Fehler beim Lesen einer Datei. Wie bei nicht aktivierten Ausnahmen müssen Sie sich nicht mit Ausnahmen befassen.

3. Wie schreibe ich die Ausnahmebehandlung?

3.1 Standardschreibstil

① 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();
}

3.2 Mehrfachfang

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;
}

3.3 Wenn Sie eine Check-Ausnahme auslösen, schreiben Sie auf jeden Fall einen Catch

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();
}

4. Verhalten nach Auftreten einer Ausnahme

4.1 Wenn in der for-Anweisung eine Ausnahme auftritt, wird keine weitere Schleifenverarbeitung durchgeführt.

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]

4.2 Vorsichtsmaßnahmen beim Überschreiben der Methode, die die Ausnahme auslöst

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

5. Referenz

    1. Sumito Shiga (2019) "Gründliche Erfassung der Korrespondenz mit Java SE 8 Silver Problem Collection [1Z0-808]" Herausgegeben von Impress Co., Ltd.
  1. [Interne Studiensitzung] Behandlung von Java-Ausnahmen (26.04.2017)
    1. Michiko Yamamoto (2015) Java-Programmierer Silver SE 7 (5. Druck) Veröffentlicht von Shosuisha Co., Ltd.

Recommended Posts