« Je voudrais te parler peu du fonctionnement des exceptions. L'exemple ci-dessous devrait te donner une idée de ce qui se passe : »
class ExempleOriginalException
{
public static void main(String[] args)
{
System.out.println("main commence");
try
{
System.out.println("main avant l'appel");
methode1();
System.out.println("main après l'appel");
}
catch (RuntimeException e)
{
String s = e.getMessage();
System.out.println(s);
}
System.out.println("main se termine");
}
public static void methode1()
{
System.out.println("methode1 commence");
methode2();
System.out.println("methode1 se termine");
}
public static void methode2()
{
System.out.println("methode2");
String s = "Message : Exception inconnue";
throw new RuntimeException(s);
}
}
public class ExempleException
{
private static Exception exception = null;
public static void main(String[] args)
{
System.out.println("main commence");
System.out.println("main avant l'appel");
methode1();
if (exception == null)
{
System.out.println("main après l'appel");
}
else if (exception instanceof RuntimeException)
{
RuntimeException e = (RuntimeException) exception;
exception = null;
String s = e.getMessage();
System.out.println(s);
}
System.out.println("main se termine");
}
public static void methode1()
{
System.out.println("methode1 commence");
methode2();
if (exception != null) return;
System.out.println("methode1 se termine");
}
public static void methode2()
{
System.out.println("methode2");
String s = "Message : Exception inconnue";
exception = new RuntimeException(s);
return;
}
}
« Je suis complètement perdu. »
« D'accord. Je vais t'expliquer ce que nous avons là. »
« Dans l'exemple de gauche, nous appelons quelques méthodes en succession. Dans methode2
, nous créons et propageons délibérément une exception (nous créons une erreur). »
« L'exemple sur la droite montre ce qui se passe. »
« Regarde methode2
. Au lieu de créer une exception, nous créons un objet RuntimeException
, l'enregistrons dans la variable static exception
, puis sortons immédiatement de la méthode avec une instruction return
. »
« Dans methode1
, après avoir appelé methode2
, nous vérifions s'il y a une exception. S'il y a une exception, alors methode1
se termine immédiatement. Une telle vérification est effectuée indirectement après chaque (!) appel de méthode en Java. »
« Ouah ! »
« Tu l'as dit. »
« Dans la colonne de droite, j'ai utilisé la méthode main pour te donner une idée de ce qui se passe quand une exception est capturée avec une construction try-catch. S'il n'y a pas d'exception, tout continue à s'exécuter comme attendu. S'il y a une exception et qu'elle est du même type que celui spécifié dans l'instruction catch, nous la gérons. »
« Que signifient les termes throw
et instanceof
? »
« Observe la dernière ligne : throw new RuntimeException(s);
. C'est comme ça que tu crées et propages une exception. Nous n'allons pas travailler là-dessus tout de suite. Ce n'était qu'un exemple. »
« Nous utilisons a instanceof B
pour vérifier si l'objet a
est de type B
, c'est-à-dire si l'objet référencé par la variable exception est une RuntimeException. C'est une expression booléenne. »
« Je crois que j'ai compris. Presque. »
GO TO FULL VERSION