Gestion des exceptions Java?

0. Introduction

Comme d'habitude, je ne connaissais pas l'exception Java, je l'ai donc résumée. Cette fois (quoi?) J'écrirai un article comme mon propre mémo.

1. Qu'est-ce que la gestion des exceptions?

Il y avait différentes définitions des exceptions, j'ai donc cité la référence 1 p.264.

Il existe à peu près deux types de problèmes qui surviennent lors de l'exécution du programme en Java. erreur </ font> qui indique une situation que le programme ne peut pas gérer, comme un problème dans l'environnement d'exécution, et exception </ font> que le programme peut gérer Il y en a deux.

Les exceptions sont divisées en exceptions vérifiées et exceptions non vérifiées. Une exception vérifiée </ font> est une exception que le compilateur vérifie pour voir si vous avez écrit la gestion des exceptions. L'autre exception non cochée </ font> est une exception que le compilateur ne vérifie pas pour voir si vous avez écrit la gestion des exceptions.

Et cela. En bref, il peut être divisé en trois. De plus, il existe des classes d'exceptions correspondant à chaque exception et leurs relations sont les suivantes.

スライド1.PNG

(Je veux aussi mettre une sous-classe)

2. Principes de base de chaque exception

① Exception d'inspection

Les classes d'exception qui héritent d'Exception, qui est une classe d'exceptions vérifiées, doivent être déclarées dans une clause try-catch ou throws. L'inspection ici signifie attraper ou lancer. Si vous ne vérifiez pas les exceptions cochées, vous obtiendrez une erreur de compilation.

** ② Exception non cochée **

Même dans la sous-classe Exception, si RuntimeException est héritée, elle est traitée comme une exception non vérifiée et un traitement tel que try-catch devient inutile. Bien sûr, il n'y a pas de problème même si le traitement des exceptions est décrit.

** ③ Erreur **

Exceptions telles que le manque de mémoire ou l'échec de la lecture d'un fichier. Comme pour les exceptions non vérifiées, vous n'avez pas à gérer les exceptions.

3. Comment écrire la gestion des exceptions

3.1 Style d'écriture standard

① Exception de capture Lorsque vous lancez explicitement une exception, ajoutez throw (vérifier l'exception uniquement? Valider) Le paramètre du bloc catch est Throwable, vous pouvez donc intercepter toutes les exceptions.

try {  //Joindre les traitements susceptibles de déclencher une exception
  throw new Exception();
} catch (Exception e) {
  ...  //Géré lorsqu'une exception se produit lors d'un essai
} finally {
  //Exécuté avec ou sans exception
}

(2) Utilisez throws dans la déclaration de méthode qui lève une exception.

private void hogehoge() throws Exception {
  throw new Exception();
}

3.2 Multi-capture

Vous pouvez spécifier plusieurs classes d'exceptions à intercepter. J'ai cité la référence 2.

//Pour Java 6 ou version antérieure
try {
  . . . 
} catch (IOException ex) {
     logger.log(ex);
     throw ex;
} catch (SQLException ex) {
     logger.log(ex);
     throw ex;
}

//Pour Java 7 ou version ultérieure
try {
  . . . 
} catch (IOException|SQLException ex) {
    logger.log(ex);
    throw ex;
}

3.3 Si vous écrivez un jet d'exception check, écrivez définitivement un catch

Une méthode qui lève une exception vérifiée entraînera une erreur de compilation sauf si elle est interceptée ou renvoyée. .. ..

public void method() throws Exception {}

// case1
try {
  method();
} catch (Exception e) {  //Erreur sans prise
  ...
} 

// case 2
public void method2() throws Exception {  //Erreur si non renvoyée
  method();
}

4. Comportement après une exception

4.1 Si une exception se produit dans l'instruction for, aucun autre traitement de boucle ne sera effectué.

Référence 1 Extrait de la p.349. Puisque StirngIndexOutOfboundsException se produit lorsque ʻi = 1, le traitement en boucle de ʻi> 1 n'est pas exécuté.

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

//Résultat d'exécution
//Sortie d'erreur due à la détection d'une erreur
// bcd     array2[0]
// null    array2[1]
// null    array2[2]

4.2 Précautions lors du remplacement de la méthode lançant l'exception

Si vous remplacez la méthode qui lève l'exception, les restrictions suivantes seront ajoutées à cette méthode (référence 3 p. 299 avec quelques modifications).

(1) Les exceptions qui peuvent être levées par la méthode de sous-classe sont les mêmes que les exceptions levées par la méthode de superclasse, ou les exceptions de cette sous-classe. (2) Quelle que soit l'exception levée par la méthode de la superclasse, la méthode de la sous-classe peut la lancer en tant que RuntimeException ou une exception de cette sous-classe (elle peut être vaincue en tant qu'exception d'exécution). ③ En premier lieu, juste parce qu'une méthode de superclasse lève une exception, il n'est pas indispensable de la lancer dans une méthode de sous-classe.

Donnez un exemple concret (référence 3 citée à partir de la page 300). Ici, NG: Erreur de compilation.

class Super { void method() throws IOException {} }

class SubA { void method() }  //OK, vous n'êtes pas obligé de lancer une exception
class SubB { void method() throws FileNotFoundException {} }  //Lancer une sous-classe de OK IOException
class SubC { void method() throws Exception {} }  //Lancer une superclasse de NG IOException
class SubD { void method() throws ClassNotFoundException {} }  //Lancer une classe d'exception qui n'est pas héritée de NG IOException
class SubE { void method() throws RuntimeException {} }  //OK, je vainc une exception d'exécution

5. Référence

    1. Sumito Shiga (2019) «Capture approfondie Java SE 8 Silver problem collection [1Z0-808] correspondance» Publié par Impress Co., Ltd.
  1. [Session d'étude interne] Gestion des exceptions Java (2017/04/26)
    1. Michiko Yamamoto (2015) Java Programmer Silver SE 7 (5ème édition) Edité par Shosuisha Co., Ltd.

Recommended Posts