[Einführung in Java] Informationen zur Ausnahmebehandlung (try-catch-finally, aktivierte Ausnahme, nicht aktivierte Ausnahme, Würfe, Würfe)

Zweck

Für diejenigen, die gerade mit dem Programmieren einschließlich der Java-Sprache begonnen haben, und für diejenigen, die es bereits gelernt haben, zur Überprüfung Dieses Mal schreibe ich, um mehr über ** Ausnahmebehandlung ** zu erfahren.

[Einführung in Java]

Was ist Ausnahmebehandlung?

Wenn der Quellcode einen Grammatikfehler enthält, wird zum Zeitpunkt der Kompilierung ein Fehler ausgegeben, der nicht ausgeführt werden kann. Daher ist es möglich, den Grammatikfehler oder -fehler zu korrigieren.

Ein Fehler, der zum Zeitpunkt der Kompilierung nicht bekannt ist, aber nach der Ausführung festgestellt wird, wird als Ausnahme bezeichnet.

Um die oben erwähnte unerwartete Operation (Ausnahme) zu verhindern, wird die entsprechende Verarbeitung als ** Ausnahmeverarbeitung ** bezeichnet.

Ausnahmeklasse

・ Throwable ← Fehler, Ausnahme Superklasse (Elternklasse)

Unterklassen (untergeordnete Klassen) der Throwable-Klasse ・ ** Fehlerklasse ** ・ ** Ausnahme **

Unterklassen (untergeordnete Klassen) der Exception-Klasse ・ ** RuntimeException-Klasse ** ・ ** Andere Klassen **

Die RuntimeException-Klasse verfügt auch über Unterklassen (untergeordnete Klassen).

Ausnahmebehandlungsmethode

① Try-Catch-finally-Block

try-catch Lassen Sie uns zuerst den Code normal schreiben.

Main.java


class Error {
  public static void main(String[] args) {
    String[] fruits = {"Apfel", "Banane", "Mandarine"};

    //Extrahieren Sie das Fruchtarray nacheinander, aber versuchen Sie, außerhalb der Elemente des Arrays darauf zuzugreifen
    for(int i = 0; i < 4; i++) {
      System.out.println(fruits[i]);
    }
    System.out.println("Alle Früchte angezeigt");
  }
}

Ausgabeergebnis


Apfel
Banane
Mandarine
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
        at Main.main(Main.java:6)

Es wurde wie oben angezeigt. Das letzte "Alle Früchte anzeigen" wird nicht ausgegeben und das Programm endet in der Mitte.

Als nächstes ändern wir den obigen Code mit der try-catch-Anweisung.

Beschreiben Sie im try-Block den Teil, in dem die Ausnahme wahrscheinlich auftritt. Schreiben Sie `catch (Name der Ausnahmeklassenname) und Beschreiben Sie im "catch-Block" die Verarbeitung, wenn eine Ausnahme auftritt.

Main.java


class Main {
  public static void main(String[] args) {
    String[] fruits = {"Apfel", "Banane", "Mandarine"};

    try {
      //Verarbeitung, die wahrscheinlich eine Ausnahme verursacht
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    } catch(ArrayIndexOutOfBoundsException e) {
      //Was tun, wenn eine Ausnahme auftritt?
      System.out.println("Ausnahme aufgetreten");
    }
    System.out.println("Alle Früchte angezeigt");
  }
}

Wenn du rennst

Ausgabeergebnis


Apfel
Banane
Mandarine
Ausnahme aufgetreten
Alle Früchte angezeigt

Es wurde wie oben ausgegeben. In der vierten Schleife ist eine Ausnahme aufgetreten, und die Verarbeitung innerhalb des catch-Blocks wird ausgeführt. Und das Programm wird bis zum letzten "Alle Früchte anzeigen" ausgegeben, ohne in der Mitte zu enden.

finally

Beschreiben Sie im "finally-Block" den Prozess, den Sie ausführen möchten, unabhängig davon, ob eine Ausnahme auftritt oder nicht.

Wenn keine Ausnahme auftritt (Zugriff innerhalb eines Elements des Arrays)

Main.java


class Main {
  public static void main(String[] args) {
    String[] fruits = {"Apfel", "Banane", "Mandarine"};

    try {
      //Verarbeitung, die wahrscheinlich eine Ausnahme verursacht
      for(int i = 0; i < 3; i++) {
        System.out.println(fruits[i]);
      }
    } catch(ArrayIndexOutOfBoundsException e) {
      //Was tun, wenn eine Ausnahme auftritt?
      System.out.println("Ausnahme aufgetreten");
    } finally {
      //Immer mit oder ohne Ausnahmen ausgeführt
      System.out.println("Achten Sie darauf, zu verarbeiten");
    }
    System.out.println("Alle Früchte angezeigt");
  }
}

Wenn du rennst

Ausgabeergebnis


Apfel
Banane
Mandarine
Achten Sie darauf, zu verarbeiten
Alle Früchte angezeigt

Die Verarbeitung im finally-Block wird wie oben beschrieben ausgeführt.

Das nächste Mal, wenn eine Ausnahme auftritt (Zugriff außerhalb der Elemente des Arrays)

Main.java


class Main {
  public static void main(String[] args) {
    String[] fruits = {"Apfel", "Banane", "Mandarine"};

    try {
      //Verarbeitung, die wahrscheinlich eine Ausnahme verursacht
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    } catch(ArrayIndexOutOfBoundsException e) {
      //Was tun, wenn eine Ausnahme auftritt?
      System.out.println("Ausnahme aufgetreten");
    } finally {
      //Immer mit oder ohne Ausnahmen ausgeführt
      System.out.println("Achten Sie darauf, zu verarbeiten");
    }
    System.out.println("Alle Früchte angezeigt");
  }
}

Wenn du rennst

Ausgabeergebnis


Apfel
Banane
Mandarine
Ausnahme aufgetreten
Achten Sie darauf, zu verarbeiten
Alle Früchte angezeigt

Es wurde wie oben ausgegeben. Eine Ausnahme wird ausgelöst und die Verarbeitung innerhalb des catch-Blocks wird ausgeführt. Dann wird die Verarbeitung im finally-Block ausgeführt und die Ausgabe erfolgt bis zur letzten "Anzeige aller Früchte".

Vorsichtsmaßnahmen für Try-Catch-Endlich

Als Kombination des Schreibstils wie oben ・ Try-Catch ・ Endlich versuchen ・ Versuchen Sie es endlich Ist in Ordnung!

Die folgende Schreibmethode führt zu einem Kompilierungsfehler.

・ Versuchen Sie nur zu blockieren

Main.java


class Main {
  public static void main(String[] args) {
    String[] fruits = {"Apfel", "Banane", "Mandarine"};

    //Nur Try-Blöcke sind Kompilierungsfehler
    try {
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    }
    System.out.println("Alle Früchte angezeigt");
  }
}

・ Endlich versuchen, endlich versuchen

Main.java


class Main {
  public static void main(String[] args) {
    String[] fruits = {"Apfel", "Banane", "Mandarine"};

    // try-finally-catch ist ein Kompilierungsfehler
    try {
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    } finally {
      System.out.println("Achten Sie darauf, zu verarbeiten");
    } catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Ausnahme aufgetreten");
    }

    // catch-finally-versuchen Sie auch Kompilierungsfehler
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Ausnahme aufgetreten");
    } try {
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    } finally {
      System.out.println("Achten Sie darauf, zu verarbeiten");
    }
  }
}

Ausnahmetyp

Ich habe gelernt, wie man mit Try-Catch-finally-Blöcken mit Ausnahmen umgeht. Lassen Sie uns hier die Arten von Ausnahmen ansprechen und lernen, wann sie tatsächlich verwendet werden sollen.

** Deaktivierte Ausnahme ** Ausnahmen, bei denen der Compiler nicht prüft, ob die Ausnahmebehandlung beschrieben ist (Beschreibung der Ausnahmeverarbeitung ist optional) Das Ziel ist die RuntimeException-Klasse und darunter.

Da die Ausnahmebehandlung optional ist, gibt es kein Problem mit der Java-Syntax selbst und sie kann kompiliert werden.

Main.java


class Main {
  public static void main(String[] args) {
    int[] num = {10, 20, 30};
    System.out.println(num[3]); //Es wird versucht, außerhalb des Bereichs des num-Arrays auszugeben
  }
}

Wenn Sie die obige Datei kompilieren und ausführen

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
        at Main.main(Main9.java:71)

Ich erhalte eine Ausnahme für ArrayIndexOutOfBoundsException, eine Unterklasse von RuntimeException. Die Ausnahme ist, wenn der Index (Index) des Arrays außerhalb des Bereichs liegt.

Normalerweise wird keine Ausnahmebehandlung durchgeführt, da solche Ausnahmen durch die Programmiererprüfung zum Zeitpunkt der Codierung verhindert werden können. (Wenn Sie die Ausnahmebehandlung an allen Stellen schreiben, an denen wahrscheinlich Ausnahmen auftreten, ist der Code kompliziert.)

Aber vorerst werde ich es in eine Try-Catch-Erklärung aufnehmen.

Main.java


class Main {
  public static void main(String[] args) {
    String[] fruits = {"Apfel", "Banane", "Mandarine"};

    int[] num = {10, 20, 30};
    try {
      System.out.println(num[3]); //Es wird versucht, außerhalb des Bereichs des num-Arrays auszugeben
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("Ausnahme aufgetreten");
    }
  }
}

Wenn Sie es kompilieren und ausführen

Ausnahme aufgetreten

Die Verarbeitung in der catch-Anweisung wird ausgeführt.

** Inspektionsausnahme ** Eine Ausnahme, bei der der Compiler prüft, ob die Ausnahmebehandlung beschrieben wurde (Ausnahmebehandlung muss beschrieben werden). Andere Klassen als RuntimeException werden als Ziel ausgewählt.

Eine Beschreibung der Ausnahmebehandlung ist obligatorisch, andernfalls tritt beim Kompilieren ein Fehler auf. Lass uns einen Blick darauf werfen.

Wenn es keine Beschreibung der Ausnahmebehandlung gibt.

Main.java


import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

class Main {
  public static void main(String[] args) {
    //Geben Sie den Dateipfad an
    File file = new File("test.text");

    //Holen Sie sich eine Zeile in den Inhalt der Datei
    FileReader fileReader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String str = bufferedReader.readLine();

    //Drehen Sie die Schleife und zeigen Sie sie zeilenweise an
    while(str != null){
      System.out.println(str);
      str = bufferedReader.readLine();
    }

    //Schließen Sie schließlich die Datei, um Ressourcen freizugeben
    bufferedReader.close();
  }
}

Wenn Sie dies kompilieren,

    Main.java:13:Error:Die Ausnahme FileNotFoundException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
    FileReader fileReader = new FileReader(file);
                                ^
    Main.java:15:Error:Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
        String str = bufferedReader.readLine();
                                            ^
    Main.java:20:Error:Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
          str = bufferedReader.readLine();
                                      ^
    Main.java:24:Error:Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
        bufferedReader.close();
                            ^
4 Fehler

Wenn Sie kompilieren, ohne die Ausnahmebehandlung zu beschreiben, tritt ein Kompilierungsfehler auf.

Fügen Sie es als Nächstes in eine try-catch-Anweisung ein.

Main.java


import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

class Main {
  public static void main(String[] args) {
    
    // try-Wenn die Ausnahmebehandlung von catch beschrieben wird
    try {
      //Geben Sie den Dateipfad an
      File file = new File("test.text");

      //Holen Sie sich eine Zeile in den Inhalt der Datei
      FileReader fileReader = new FileReader(file);
      BufferedReader bufferedReader = new BufferedReader(fileReader);
      String str = bufferedReader.readLine();

      //Drehen Sie die Schleife und zeigen Sie sie zeilenweise an
      while(str != null){
        System.out.println(str);
        str = bufferedReader.readLine();
      }

      //Schließen Sie schließlich die Datei, um Ressourcen freizugeben
      bufferedReader.close();

    } catch (IOException e) {
      System.out.println("Ausnahme aufgetreten");
    }
  }
}

Beim Kompilieren wird kein Kompilierungsfehler angezeigt. Wenn du rennst

AIUEO
Kakikukeko
SA Shi Su Se So.

Und der Inhalt der Datei test.txt wird ausgegeben.

Dieses Mal mache ich absichtlich einen Fehler im Pfadspezifikationsteil der Datei.

Main.java


import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

class Main {
  public static void main(String[] args) {
    
    // try-Wenn die Ausnahmebehandlung von catch beschrieben wird
    try {
      //Geben Sie den Dateipfad an
      File file = new File("aaaaaaaaa.text"); //Geben Sie eine Textdatei an, die nicht vorhanden ist

      //Holen Sie sich eine Zeile in den Inhalt der Datei
      FileReader fileReader = new FileReader(file);
      BufferedReader bufferedReader = new BufferedReader(fileReader);
      String str = bufferedReader.readLine();

      //Drehen Sie die Schleife und zeigen Sie sie zeilenweise an
      while(str != null){
        System.out.println(str);
        str = bufferedReader.readLine();
      }

      //Schließen Sie schließlich die Datei, um Ressourcen freizugeben
      bufferedReader.close();

    } catch (IOException e) {
      System.out.println("Ausnahme aufgetreten");
    }
  }
}

Sie können kompilieren. Wenn ich es laufen lasse,

Ausnahme aufgetreten

Wurde ausgegeben. Eine Ausnahme ist aufgetreten und die Verarbeitung in der catch-Anweisung wird ausgeführt.

Bei anderen Klassen als RuntimeException, wie oben beschrieben, sollten Sie sich bewusst sein, dass es Fälle gibt, in denen ein Kompilierungsfehler auftritt, wenn die Ausnahmebehandlung nicht beschrieben wird.

②throws

Zusätzlich zur Ausnahmebehandlung für try-catch-block-Blöcke können Sie auch das Schlüsselwort throw verwenden, um Ausnahmen zu behandeln.

Dieses Schlüsselwort wird verwendet, wenn eine Methode definiert wird, die eine Ausnahme auslösen kann. Durch Angabe von "löst den Namen der auftretenden Ausnahmeklasse aus" Der Mechanismus ist so, dass die Ausnahme an den Aufrufer dieser Methode weitergeleitet wird.

Insbesondere werde ich versuchen, daraus eine Methode zu machen, die auf dem obigen Beispielcode basiert.

Definieren Sie die Operation zum Lesen und Ausgeben der Datei als Methode in einer anderen Klasse. Verwenden Sie beim Definieren dieser Methode das Schlüsselwort "throw".

GetText.java


import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;

class GetText {
  //Die durch throw angegebene Methode löst die Ausnahme für den Aufrufer aus
  public void getText() throws IOException {
    //Geben Sie den Dateipfad an
    File file = new File("aaaaaaaaa.text"); //Geben Sie eine Textdatei an, die nicht vorhanden ist

    //Holen Sie sich eine Zeile in den Inhalt der Datei
    FileReader fileReader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String str = bufferedReader.readLine();

    //Drehen Sie die Schleife und zeigen Sie sie zeilenweise an
    while(str != null){
      System.out.println(str);
      str = bufferedReader.readLine();
    }

    //Schließen Sie schließlich die Datei, um Ressourcen freizugeben
    bufferedReader.close();
  }
}

Wenn beim Aufrufen der getText-Methode in Main.java eine Ausnahme auftritt, wird die hier beschriebene catch-Anweisung verarbeitet.

Main.java


import java.io.IOException;

class Main {
  public static void main(String[] args) {
    //Zum Zeitpunkt der Würfe
    try {
      GetText gt = new GetText();

      //Rufen Sie die getText-Methode mit dem Schlüsselwort throw auf
      gt.getText();

    //Fangen Sie die Ausnahme
    } catch (IOException e) {
      System.out.println("Ausnahme aufgetreten");
    }
  }
}

Wenn Sie diese Datei kompilieren, können Sie sie kompilieren. Lass es einfach laufen

Ausnahme aufgetreten

Ich habe eine Ausnahme für den Zugriff auf eine Datei erhalten, die in getText nicht vorhanden ist. Es gibt jedoch keine Beschreibung der try-catch-Anweisung in der Verarbeitungsmethode.

Durch Deklarieren des Ausnahmeklassennamens, der beim Definieren der Methode "Würfe" verursacht, Beim Aufrufer dieser Methode wird in der catch-Anweisung eine Ausnahme ausgelöst (ausgelöst), und die Ausnahmebehandlung wird durchgeführt.

Versuchen Sie übrigens, die try-catch-Anweisung beim Methodenaufrufer zu entfernen.

Main.java


import java.io.IOException;

class Main {
  public static void main(String[] args) {
    //Versuchen Sie es zum Zeitpunkt der Würfe-Wenn die catch-Anweisung gelöscht wird
    GetText gt = new GetText();
    gt.getText();
  }
}

Wenn Sie kompilieren ...

Main.java:16:Error:Ausnahme IOException wird nicht gemeldet. Muss gefangen genommen oder zum Werfen erklärt werden
    gt.getText();
              ^
1 Fehler

Ich erhalte einen Kompilierungsfehler. Beachten Sie, dass selbst wenn Sie eine Methode definieren, die das Schlüsselwort throw verwendet, ein Kompilierungsfehler auftritt, wenn der Aufrufer der Methode die Ausnahmebehandlung nicht mithilfe der try-catch-Anweisung beschreibt.

③throw

Sie können eine Ausnahme in Ihrem Programm explizit mit dem Schlüsselwort "throw" auslösen. Der Unterschied zu Würfen besteht darin, dass Würfe beim Auftreten einer Ausnahme abfangen, während Würfe explizit eine Ausnahme abfangen. Daher können Sie absichtlich selbst eine Ausnahme auslösen.

Main.java


class Main {
  public static void main(String[] args) {

    int[] num = {10, 20, 30};
    try {
      for(int i = 0; i < num.length; i++) {
        System.out.println(num[i]);
        if(num[i] < 20) {

          //Eine Ausnahme explizit auslösen
          throw new Exception();
        }
      }
    } catch (Exception e) {
      System.out.println("Ausnahme aufgetreten");
    }
  }
}

Wenn Sie mit dem obigen Code kompilieren und ausführen,

10
Ausnahme aufgetreten

Bei der Ausgabe von num-Arrays nacheinander wird explizit eine Ausnahme ausgelöst, wenn sie 20 überschreitet. Infolgedessen wird beim Versuch, die zweiten 20 auszugeben, die Verarbeitung innerhalb des Catch ausgeführt.

Das Schlüsselwort throw unterscheidet sich vom Schlüsselwort throw darin, dass Sie überall eine Ausnahme auslösen können.

Am Ende

Wenn Sie in der Java-Grammatik keinen Fehler machen, können Sie ihn kompilieren. Ich habe etwas über die Ausnahmebehandlung für den Fall gelernt, dass der Prozess während der Ausführung des Programms stoppt.

Ich möchte vorsichtig sein, da es einige geprüfte Ausnahmen gibt, die die Beschreibung der Ausnahmebehandlung in try-catch erfordern.

Ich habe nur oberflächliches Wissen, deshalb möchte ich tiefer graben und verstehen, dass es in der Praxis verwendet werden kann.

Recommended Posts

[Einführung in Java] Informationen zur Ausnahmebehandlung (try-catch-finally, aktivierte Ausnahme, nicht aktivierte Ausnahme, Würfe, Würfe)
try-catch-finally Ausnahmebehandlung Verwendung von Java
[Java] Informationen zur Behandlung von Try-Catch-Ausnahmen
[Java Silver] (Ausnahmebehandlung) Informationen zu den Anweisungen try-catch-finally und try-with-resource
[Einführung in Java] Informationen zur Stream-API
[Für Java-Anfänger] Informationen zur Ausnahmebehandlung
Java-Ausnahmebehandlung?
Informationen zur Ausnahmebehandlung
[Java] Einführung in Java
☾ Java / Ausnahmebehandlung
Einführung in Java
Informationen zur Behandlung von Java-Ausnahmen
[Einführung in Java] Informationen zur Typkonvertierung (Besetzung, Promotion)
Fragen in Java-Ausnahmebehandlung werfen und versuchen-fangen
Informationen zur Behandlung von Ruby-Ausnahmen
[Java] Wirf eine Ausnahme aus
Einführung in den Java-Befehl
[Einführung in Java] Umgang mit Zeichenfolgen (String-Klasse, StringBuilder-Klasse)
[Java] Praxis der Ausnahmebehandlung [Ausnahme]
Verwendungsregeln für die Behandlung von Java-Ausnahmen
[Java] Einführung in den Lambda-Ausdruck
Ausnahmebehandlungstechniken in Java
[Einführung in Janken (ähnliche) Spiele] Java
[Inhouse-Studiensitzung] Behandlung von Java-Ausnahmen (26.04.2017)
Einführung in die funktionale Programmierung (Java, Javascript)
[Rails] Wie schreibe ich eine Ausnahmebehandlung?
Erste Einführung in Mac (Java-Ingenieur)
Schrittweises Verständnis der Behandlung von Java-Ausnahmen
[Einführung in Java] Informationen zu Array-Operationen (1D-Array, 2D-Array-Deklaration, Instanziierung, Initialisierung und Verwendung)
[Einführung in Java] Informationen zur iterativen Verarbeitung (while, do-while, for, Erweiterung für, break, continue)