Fonctionnement de la capture multiple - 1

« 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. »

Code
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. »

Code
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. »

Code
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... »