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.
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.
(Je veux aussi mettre une sous-classe)
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.
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.
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.
① 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();
}
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;
}
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();
}
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]
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
Recommended Posts