„Ich möchte dir zeigen, wie Ausnahmen funktionieren. Das folgende Beispiel gibt dir einen groben Überblick darüber, was passiert:“

Code, der Ausnahmen verwendet:
class AusnahmeBeispielOriginal
{


    public static void main(String[] args)
    {
        System.out.println("main beginnt");
        try
        {
            System.out.println("main vor dem Aufruf");

            methode1();



            System.out.println("main nach dem Aufruf");
        }
        catch (RuntimeException e)
        {


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

    public static void methode1()
    {
        System.out.println("methode1 beginnt");
        methode2();

        System.out.println("methode1 endet");
    }

    public static void methode2()
    {
      System.out.println("methode2");
      String s = "Meldung: Unbekannte Ausnahme";
    throw new RuntimeException(s);

    }
}
Ungefähre Darstellung des Geschehens
public class AusnahmeBeispiel
{
    private static Exception ausnahme = null;

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

       
        System.out.println("main vor dem Aufruf");

        methode1();

        if (ausnahme == null)
        {
            System.out.println("main nach dem Aufruf");
        }
        else if (ausnahme instanceof RuntimeException)
        {
            RuntimeException e = (RuntimeException) ausnahme;
            ausnahme = null;
            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println(„main endet");
    }

    public static void methode1()
    {
        System.out.println("methode1 beginnt");
        methode2();
        if (ausnahme != null) return;
        System.out.println("methode1 endet");
    }

    public static void methode2()
    {
        System.out.println("methode2");
        String s = "Meldung: Unbekannte Ausnahme";
        ausnahme = new RuntimeException(s);
        return;
    }
}

„Ich bin völlig verloren.“

„In Ordnung. Ich erkläre dir, was da vor sich geht.“

„Im Beispiel links rufen wir nacheinander einige Methoden auf. In methode2 erstellen wir bewusst eine Ausnahme und lösen diese aus (wir erzeugen einen Fehler).“

„Das Beispiel rechts zeigt, was passiert.“

„Sieh dir methode2 an. Anstatt eine Ausnahme zu erstellen, erstellen wir ein RuntimeException-Objekt, speichern es in der statischen Variable ausnahme und verlassen dann die Methode sofort mit einer return-Anweisung.“

„In methode1 prüfen wir nach dem Aufruf von methode2, ob eine Ausnahme aufgetreten ist. Wenn es eine Ausnahme gibt, dann wird methode1 sofort beendet. Eine solche Überprüfung erfolgt indirekt nach jedem (!) Methodenaufruf in Java.“

„Wow!“

„Ja, wow.“

„In der rechten Spalte habe ich die main-Methode verwendet, um ungefähr zu zeigen, was passiert, wenn eine Ausnahme mit einem try-catch-Konstrukt abgefangen wird. Wenn es keine Ausnahme gibt, dann läuft alles wie erwartet weiter. Wenn es eine Ausnahme gibt und diese von derselben Art ist, die in der catch-Anweisung angegeben ist, dann behandeln wir sie.“

„Was haben throw und instanceof zu bedeuten?

„Sieh dir dir letzte Zeile an: throw new RuntimeException(s);. So erstellt man eine Ausnahme und löst diese aus. Damit befassen wir uns jetzt aber noch nicht. Das war nur ein Beispiel.“

„Wir verwenden ein instanceof B,um zu überprüfen, ob das Objekt a vom Typ B ist, d.h. ob das durch die Variable ausnahme referenzierte Objekt eine RuntimeException ist. Das ist ein boolescher Ausdruck.“

„Ich glaube, das hab ich verstanden. Fast.“