« 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("Before calling method1.");
int a = 1 / 0;
System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
System.out.println("Division by zero. Exception has been caught.");
}
catch (Exception e)
{
System.out.println("Any other errors. Exception has been caught.");
}
« 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("Before calling method1.");
int a = 1/0;
System.out.println("After calling method1. This will never be shown.");
}
catch (Exception e)
{
System.out.println("Any other errors. Exception has been caught.");
}
catch (NullPointerException e)
{
System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
System.out.println("Divided by zero. Exception has been caught.");
}
« 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("Before calling method1.");
int a = 1/0;
System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
System.out.println("Null reference. Exception has been caught.");
}
« Ç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