CodeGym /Cours Java /Syntaxe Java /Fonctionnement de la capture multiple

Fonctionnement de la capture multiple

Syntaxe Java
Niveau 9 , Leçon 7
Disponible
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... »

Commentaires (2)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Christophe niveau 22, Lausanne, Switzerland
16 avril 2020
The second exemple with Exception as a first catch doesn't compile the error is : Error:(...) java: exception java.lang.NullPointerException has already been caught Error:(...) java: exception java.lang.ArithmeticException has already been caught So there is no propagation as the code won't compile !
jpcouturier niveau 29, France, France
19 octobre 2023
Yes, your IDE can check that even if that's not a real programmation error (code under catch over first catch will be considered as unreacheable code by IDE). But it's important to understand the whole process ;)