« Je voudrais te parler peu du fonctionnement des exceptions. L'exemple ci-dessous devrait te donner une idée de ce qui se passe : »

Code utilisant des exceptions :
class ExceptionExampleOriginal
{


    public static void main(String[] args)
    {
        System.out.println("main begin");
        try
        {
            System.out.println("main before call");

            method1();



            System.out.println("main after call");
        }
        catch (RuntimeException e)
        {


            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main end");
    }

    public static void method1()
    {
        System.out.println("method1 begin");
        method2();

        System.out.println("method1 end");
    }

    public static void method2()
    {
      System.out.println("method2");
      String s = "Message: Unknown Exception";
      throw new RuntimeException(s);

    }
}
Représentation approximative de ce qui se produit
public class ExceptionExample
{
    private static Exception exception = null;

   public static void main(String[] args)
    {
        System.out.println("main begin");

       
        System.out.println("main before call");

        method1();

        if (exception == null)
        {
            System.out.println("main after call");
        }
        else if (exception instanceof RuntimeException)
        {
            RuntimeException e = (RuntimeException) exception;
            exception = null;
            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main end");
    }

    public static void method1()
    {
        System.out.println("method1 begin");
        method2();
        if (exception != null) return;
        System.out.println("method1 end");
    }

    public static void method2()
    {
        System.out.println("method2");
        String s = "Message: Unknown Exception";
        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 method2, 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 method2. 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 method1, après avoir appelé method2, nous vérifions s'il y a une exception. S'il y a une exception, alors method1 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. »