[Introduction à Java] À propos de la gestion des exceptions (try-catch-finally, exception vérifiée, exception non vérifiée, throws, throw)

Objectif

Pour ceux qui viennent de commencer à apprendre la programmation, y compris le langage Java, et ceux qui l'ont déjà appris, pour examen Cette fois, j'écris pour en savoir plus sur la ** gestion des exceptions **.

[Introduction à Java]

Qu'est-ce que la gestion des exceptions?

S'il y a une erreur grammaticale dans le code source, une erreur sera générée au moment de la compilation et elle ne peut pas être exécutée, vous pouvez donc corriger l'erreur grammaticale ou l'erreur.

Cependant, une erreur qui n'est pas connue au moment de la compilation mais qui est remarquée après l'exécution est appelée une exception.

-Problème dans l'environnement d'exécution ou dans des situations qui ne peuvent pas être traitées par le programme ** Erreur ** ・ Exclusions pouvant être traitées par le programme

Afin d'éviter le comportement inattendu (exception) mentionné ci-dessus, le traitement correspondant est appelé ** traitement d'exception **.

Classe d'exception

・ Erreur ← jetable, super classe d'exception (classe parent)

Sous-classes (classes enfants) de la classe Throwable ・ ** Classe d'erreur ** ・ ** Exception **

Sous-classes (classes enfants) de la classe Exception ・ ** Classe RuntimeException ** ・ ** Autres classes **

La classe RuntimeException a également des sous-classes (classes enfants).

Méthode de gestion des exceptions

① bloc try-catch-finally

try-catch Commençons par écrire le code normalement.

Main.java


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

    //Extrayez le tableau de fruits un par un, mais essayez d'accéder à l'extérieur des éléments du tableau
    for(int i = 0; i < 4; i++) {
      System.out.println(fruits[i]);
    }
    System.out.println("Afficher tous les fruits");
  }
}

Résultat de sortie


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

Il était affiché comme ci-dessus. Le dernier "Afficher tous les fruits" n'est pas sorti et le programme se termine au milieu.

Ensuite, modifions le code ci-dessus à l'aide de l'instruction try-catch.

Dans le bloc try, décrivez la partie où l'exception est susceptible de se produire. Écrivez catch (nom de la variable de nom de classe d'exception) et Dans le bloc catch, décrivez le traitement lorsqu'une exception se produit.

Main.java


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

    try {
      //Traitement susceptible de provoquer une exception
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    } catch(ArrayIndexOutOfBoundsException e) {
      //Que faire lorsqu'une exception se produit
      System.out.println("Une exception s'est produite");
    }
    System.out.println("Afficher tous les fruits");
  }
}

Quand tu cours

Résultat de sortie


pomme
banane
Mandarine
Une exception s'est produite
Afficher tous les fruits

C'était sortie comme ci-dessus. Une exception s'est produite dans la quatrième boucle et le traitement à l'intérieur du bloc catch est en cours d'exécution. Et, le programme est sorti jusqu'au dernier "afficher tous les fruits" sans se terminer au milieu.

finally

Dans le bloc final, décrivez le processus que vous souhaitez exécuter, qu'une exception se produise ou non.

Si aucune exception ne se produit (accès à l'intérieur d'un élément du tableau)

Main.java


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

    try {
      //Traitement susceptible de provoquer une exception
      for(int i = 0; i < 3; i++) {
        System.out.println(fruits[i]);
      }
    } catch(ArrayIndexOutOfBoundsException e) {
      //Que faire lorsqu'une exception se produit
      System.out.println("Une exception s'est produite");
    } finally {
      //Toujours exécuté avec ou sans exceptions
      System.out.println("Assurez-vous de traiter");
    }
    System.out.println("Afficher tous les fruits");
  }
}

Quand tu cours

Résultat de sortie


pomme
banane
Mandarine
Assurez-vous de traiter
Afficher tous les fruits

Le traitement dans le bloc finally est exécuté comme décrit ci-dessus.

La prochaine fois qu'une exception se produit (accès en dehors des éléments du tableau)

Main.java


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

    try {
      //Traitement susceptible de provoquer une exception
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    } catch(ArrayIndexOutOfBoundsException e) {
      //Que faire lorsqu'une exception se produit
      System.out.println("Une exception s'est produite");
    } finally {
      //Toujours exécuté avec ou sans exceptions
      System.out.println("Assurez-vous de traiter");
    }
    System.out.println("Afficher tous les fruits");
  }
}

Quand tu cours

Résultat de sortie


pomme
banane
Mandarine
Une exception s'est produite
Assurez-vous de traiter
Afficher tous les fruits

C'était sortie comme ci-dessus. Une exception est levée et le traitement à l'intérieur du bloc catch est exécuté. Ensuite, le traitement dans le bloc finally est exécuté, et la sortie est jusqu'au dernier "afficher tous les fruits".

Précautions pour try-catch-finally

En tant que combinaison de style d'écriture, comme ci-dessus ・ Try-catch ・ Essayez-enfin ・ Essayez-attrapez-enfin Est OK!

La méthode d'écriture suivante entraînera une erreur de compilation.

・ Essayez le bloc uniquement

Main.java


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

    //Seuls les blocs d'essai sont des erreurs de compilation
    try {
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    }
    System.out.println("Afficher tous les fruits");
  }
}

・ Essayer-enfin-attraper, attraper-enfin-essayer

Main.java


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

    // try-finally-catch est une erreur de compilation
    try {
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    } finally {
      System.out.println("Assurez-vous de traiter");
    } catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Une exception s'est produite");
    }

    // catch-finally-essayez également de compiler l'erreur
    catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Une exception s'est produite");
    } try {
      for(int i = 0; i < 4; i++) {
        System.out.println(fruits[i]);
      }
    } finally {
      System.out.println("Assurez-vous de traiter");
    }
  }
}

Type d'exception

J'ai appris à gérer les exceptions avec des blocs try-catch-finally, Voyons ici les types d'exceptions et apprenons quand les utiliser réellement.

** Exception non cochée ** Une exception dans laquelle le compilateur ne vérifie pas si la gestion des exceptions est décrite (la description du traitement des exceptions est facultative) La cible est la classe RuntimeException et ci-dessous.

Comme la gestion des exceptions est arbitraire, il n'y a aucun problème avec la syntaxe java elle-même et elle peut être compilée.

Main.java


class Main {
  public static void main(String[] args) {
    int[] num = {10, 20, 30};
    System.out.println(num[3]); //Tentative de sortie en dehors de la plage du tableau num
  }
}

Lorsque vous compilez et exécutez le fichier ci-dessus

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

Je reçois une exception pour ArrayIndexOutOfBoundsException, une sous-classe de RuntimeException. L'exception est lorsque l'index (indice) du tableau est hors de portée.

Normalement, la gestion des exceptions n'est pas effectuée car de telles exceptions peuvent être évitées par la vérification du programmeur au moment du codage. (Si vous écrivez la gestion des exceptions dans tous les endroits où des exceptions sont susceptibles de se produire, ce sera du code compliqué)

Mais pour le moment, je vais le mettre dans une déclaration try-catch.

Main.java


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

    int[] num = {10, 20, 30};
    try {
      System.out.println(num[3]); //Tentative de sortie en dehors de la plage du tableau num
    } catch (ArrayIndexOutOfBoundsException e) {
      System.out.println("Une exception s'est produite");
    }
  }
}

Lorsque vous compilez et exécutez

Une exception s'est produite

Le traitement dans l'instruction catch est en cours d'exécution.

** Exception d'inspection ** Une exception dans laquelle le compilateur vérifie si la gestion des exceptions a été décrite (la gestion des exceptions doit être décrite). D'autres classes autres que RuntimeException sont ciblées.

Une description de la gestion des exceptions est obligatoire, sinon une erreur se produira lors de la compilation. Nous allons jeter un coup d'oeil.

Lorsqu'il n'y a pas de description de la gestion des exceptions.

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) {
    //Spécifiez le chemin du fichier
    File file = new File("test.text");

    //Obtenez une ligne dans le contenu du fichier
    FileReader fileReader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String str = bufferedReader.readLine();

    //Tournez la boucle et affichez ligne par ligne
    while(str != null){
      System.out.println(str);
      str = bufferedReader.readLine();
    }

    //Fermez enfin le fichier pour libérer des ressources
    bufferedReader.close();
  }
}

Lorsque vous compilez ceci,

    Main.java:13:Erreur:L'exception FileNotFoundException n'est pas signalée. Doit être capturé ou déclaré lancer
    FileReader fileReader = new FileReader(file);
                                ^
    Main.java:15:Erreur:L'exception IOException n'est pas signalée. Doit être capturé ou déclaré lancer
        String str = bufferedReader.readLine();
                                            ^
    Main.java:20:Erreur:L'exception IOException n'est pas signalée. Doit être capturé ou déclaré lancer
          str = bufferedReader.readLine();
                                      ^
    Main.java:24:Erreur:L'exception IOException n'est pas signalée. Doit être capturé ou déclaré lancer
        bufferedReader.close();
                            ^
4 erreurs

Si vous compilez sans décrire la gestion des exceptions, une erreur de compilation se produira.

Ensuite, placez-le dans une instruction try-catch.

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-Lorsque la gestion des exceptions de catch est décrite
    try {
      //Spécifiez le chemin du fichier
      File file = new File("test.text");

      //Obtenez une ligne dans le contenu du fichier
      FileReader fileReader = new FileReader(file);
      BufferedReader bufferedReader = new BufferedReader(fileReader);
      String str = bufferedReader.readLine();

      //Tournez la boucle et affichez ligne par ligne
      while(str != null){
        System.out.println(str);
        str = bufferedReader.readLine();
      }

      //Fermez enfin le fichier pour libérer des ressources
      bufferedReader.close();

    } catch (IOException e) {
      System.out.println("Une exception s'est produite");
    }
  }
}

Lorsque je compile, je n'obtiens pas d'erreur de compilation. Quand tu cours

AIUEO
Kakikukeko
SA Shi Su Se So

Et le contenu du fichier test.txt est sorti.

Cette fois, je fais intentionnellement une erreur dans la partie spécification de chemin du fichier.

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-Lorsque la gestion des exceptions de catch est décrite
    try {
      //Spécifiez le chemin du fichier
      File file = new File("aaaaaaaaa.text"); //Spécifiez un fichier texte qui n'existe pas

      //Obtenez une ligne dans le contenu du fichier
      FileReader fileReader = new FileReader(file);
      BufferedReader bufferedReader = new BufferedReader(fileReader);
      String str = bufferedReader.readLine();

      //Tournez la boucle et affichez ligne par ligne
      while(str != null){
        System.out.println(str);
        str = bufferedReader.readLine();
      }

      //Fermez enfin le fichier pour libérer des ressources
      bufferedReader.close();

    } catch (IOException e) {
      System.out.println("Une exception s'est produite");
    }
  }
}

Vous pouvez compiler. Quand je l'exécute,

Une exception s'est produite

A été sortie. Une exception s'est produite et le traitement dans l'instruction catch est en cours d'exécution.

Dans le cas d'autres classes autres que RuntimeException comme décrit ci-dessus, vous devez être conscient qu'il existe des cas où une erreur de compilation se produit si la gestion des exceptions n'est pas décrite.

②throws

En plus de la gestion des exceptions de bloc try-catch-block, vous pouvez également gérer les exceptions à l'aide du mot clé throws.

Ce mot clé est utilisé lors de la définition d'une méthode qui peut déclencher une exception. En spécifiant «lève le nom de la classe d'exception qui se produit» Le mécanisme est tel que l'exception est transmise à l'appelant de cette méthode.

Plus précisément, je vais essayer d'en faire une méthode basée sur l'exemple de code ci-dessus.

Définissez l'opération de lecture et de sortie du fichier en tant que méthode dans une autre classe. Utilisez le throws keyword lors de la définition de cette méthode.

GetText.java


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

class GetText {
  //La méthode spécifiée par throws lève l'exception à l'appelant
  public void getText() throws IOException {
    //Spécifiez le chemin du fichier
    File file = new File("aaaaaaaaa.text"); //Spécifiez un fichier texte qui n'existe pas

    //Obtenez une ligne dans le contenu du fichier
    FileReader fileReader = new FileReader(file);
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    String str = bufferedReader.readLine();

    //Tournez la boucle et affichez ligne par ligne
    while(str != null){
      System.out.println(str);
      str = bufferedReader.readLine();
    }

    //Fermez enfin le fichier pour libérer des ressources
    bufferedReader.close();
  }
}

Lors de l'appel de la méthode getText dans Main.java, si une exception se produit, l'instruction catch décrite ici sera traitée.

Main.java


import java.io.IOException;

class Main {
  public static void main(String[] args) {
    //Au moment des lancers
    try {
      GetText gt = new GetText();

      //Appelez la méthode getText à l'aide du mot clé throws
      gt.getText();

    //Attrapez l'exception
    } catch (IOException e) {
      System.out.println("Une exception s'est produite");
    }
  }
}

Si vous compilez ce fichier, vous pouvez le compiler. Exécutez-le simplement

Une exception s'est produite

J'ai une exception pour accéder à un fichier qui n'existe pas dans getText. Cependant, il n'y a pas de description de l'instruction try-catch dans la méthode de traitement.

En déclarant le nom de classe d'exception qui provoque throws lors de la définition de la méthode, Une exception est levée (levée) dans l'instruction catch à l'appelant de cette méthode et la gestion des exceptions est effectuée.

Au fait, essayez d'éliminer l'instruction try-catch au niveau de l'appelant de la méthode,

Main.java


import java.io.IOException;

class Main {
  public static void main(String[] args) {
    //Au moment des lancers, essayez-Lorsque l'instruction catch est supprimée
    GetText gt = new GetText();
    gt.getText();
  }
}

Lorsque vous compilez ...

Main.java:16:Erreur:L'exception IOException n'est pas signalée. Doit être capturé ou déclaré lancer
    gt.getText();
              ^
1 erreur

J'obtiens une erreur de compilation. Notez que même si vous définissez une méthode qui utilise le mot clé throws, une erreur de compilation se produira si l'appelant de la méthode ne décrit pas la gestion des exceptions à l'aide de l'instruction try-catch.

③throw

Vous pouvez explicitement lancer une exception dans votre programme en utilisant le throw keyword. Contrairement à throws, lance des captures lorsqu'une exception se produit, mais renvoie explicitement une exception. Par conséquent, vous pouvez intentionnellement déclencher vous-même une exception.

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) {

          //Lancement explicite d'une exception
          throw new Exception();
        }
      }
    } catch (Exception e) {
      System.out.println("Une exception s'est produite");
    }
  }
}

Si vous compilez et exécutez avec le code ci-dessus,

10
Une exception s'est produite

Lors de la sortie de nombre de tableaux un par un, il est explicitement fait pour déclencher une exception quand elle dépasse 20. En conséquence, lors de la tentative de sortie du second 20, le traitement dans la capture est en cours d'exécution.

Le mot clé throw est différent du mot clé throws en ce sens que vous pouvez lever une exception n'importe où.

À la fin

Si vous ne faites pas d'erreur dans la syntaxe Java, vous pouvez la compiler. J'ai appris la gestion des exceptions au cas où le processus s'arrêterait pendant l'exécution du programme.

Je veux être prudent car il existe des exceptions vérifiées qui nécessitent la description de la gestion des exceptions dans try-catch.

Je n'ai que des connaissances superficielles, je voudrais donc creuser plus profondément et comprendre qu'elles peuvent être utilisées dans la pratique.

Recommended Posts

[Introduction à Java] À propos de la gestion des exceptions (try-catch-finally, exception vérifiée, exception non vérifiée, throws, throw)
gestion des exceptions try-catch-finally Comment utiliser java
[Java] À propos de la gestion des exceptions try-catch
[Java Silver] (Gestion des exceptions) À propos des instructions try-catch-finally et try-with-resource
[Introduction à Java] À propos de l'API Stream
[Pour les débutants en Java] À propos de la gestion des exceptions
Gestion des exceptions Java?
À propos de la gestion des exceptions
[Java] Introduction à Java
☾ Java / Gestion des exceptions
Introduction à Java
À propos de la gestion des exceptions Java
[Introduction à Java] À propos de la conversion de type (distribution, promotion)
Questions sur la gestion des exceptions Java throw et try-catch
À propos de la gestion des exceptions Ruby
[java] Lancer une exception
Introduction à la commande java
[Introduction à Java] Gestion des chaînes de caractères (classe String, classe StringBuilder)
[Java] Pratique de la gestion des exceptions [Exception]
Règles d'utilisation pour la gestion des exceptions Java
[Java] Introduction à l'expression lambda
Techniques de gestion des exceptions en Java
[Introduction aux jeux Janken (comme)] Java
[Session d'étude interne] Gestion des exceptions Java (2017/04/26)
Introduction à la programmation fonctionnelle (Java, Javascript)
[Rails] Comment écrire la gestion des exceptions?
Introduction initiale à Mac (ingénieur Java)
Compréhension étape par étape de la gestion des exceptions Java
[Introduction à Java] À propos des opérations de tableau (tableau 1D, déclaration de tableau 2D, instanciation, initialisation et utilisation)
[Introduction à Java] À propos du traitement itératif (while, do-while, for, extension for, break, continue)