« 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 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);

    }
}
Représentation approximative de ce qui se produit
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. »