
« Je t'apporte quelques nouvelles leçons intéressantes. Oh, que j'aime enseigner ! »
« J'aimerais t'expliquer comment les blocs catch multiples fonctionnent. C'est très simple : quand des exceptions se produisent dans un bloc try, l'exécution passe au premier bloc catch. »
« Si un type indiqué dans les parenthèses du bloc catch correspond au type de l'exception levée, l'exécution commence à l'intérieur de ce bloc. Sinon, nous allons au bloc catch suivant, où la même vérification se produit. »
« Si nous arrivons à court de blocs catch et que l'exception n'a pas été capturée, elle est propagée, et la méthode en cours se termine de façon anormale. »
« Je vois. Le bloc catch qui coïncide avec le type de l'exception est celui qui est exécuté. »
« Exact. Bien qu'en réalité, c'est un peu plus compliqué que ça. Les classes peuvent hériter d'autres classes. Si une classe Vache hérite d'une classe Animal, l'objet Vache peut être référencé non seulement par la variable Vache, mais aussi par une variable Animal. »
« Et ? »
« Comme toutes les exceptions héritent d'Exception ou de RuntimeException (qui hérite aussi d'Exception), elles peuvent toujours être capturées avec 'catch (Exception e)' ou 'catch (RuntimeException e)'. »
« Et ? »
« Nous pouvons en tirer deux conclusions. Tout d'abord, tu peux utiliser 'catch (Exception e)' pour capturer n'importe quelle exception. Deuxièmement, l'ordre des blocs catch est important. »
« Voici quelques exemples : »
« L'exception ArithmeticException
qui se produit lorsque nous divisons par 0 sera capturée dans le deuxième bloc catch. »
try
{
System.out.println("Avant l'appel de methode1.");
int a = 1 / 0;
System.out.println("Après l'appel de methode1. Cela ne s'affichera jamais.");
}
catch (NullPointerException e)
{
System.out.println("Référence null. Une exception a été capturée.");
}
catch (ArithmeticException e)
{
System.out.println("Division par zéro. Une exception a été capturée.");
}
catch (Exception e)
{
System.out.println("Autres erreurs. Une exception a été capturée.");
}
« Dans l'exemple ci-dessous, l'exception ArithmeticException
sera capturée dans le premier bloc catch, car toutes les exceptions héritent d'Exception, c'est-à-dire qu'Exception
couvre toutes les exceptions. »
try
{
System.out.println("Avant l'appel de methode1.");
int a = 1/0;
System.out.println("Après l'appel de methode1. Cela ne s'affichera jamais.");
}
catch (Exception e)
{
System.out.println("Autres erreurs. Une exception a été capturée.");
}
catch (NullPointerException e)
{
System.out.println("Référence null. Une exception a été capturée.");
}
catch (ArithmeticException e)
{
System.out.println("Division par zéro. Une exception a été capturée.");
}
« Dans l'exemple ci-dessous, l'exception ArithmeticException
ne sera pas capturée. Elle sera propagée à la méthode appelante. »
try
{
System.out.println("Avant l'appel de methode1.");
int a = 1/0;
System.out.println("Après l'appel de methode1. Cela ne s'affichera jamais.");
}
catch (NullPointerException e)
{
System.out.println("Référence null. Une exception a été capturée.");
}
« Ça clarifie un peu les choses. Ces exceptions ne sont pas le sujet le plus simple. »
« Ce n'est vrai qu'en apparence. Elles font en fait partie des choses les plus simples en Java. »
« Je ne sais pas si je dois m'en réjouir ou non... »
GO TO FULL VERSION