Eine gute Antwort wäre:

Das Stack-Protokoll zeigt die Kette der Methodenaufrufe, die zu demjenigen führen, der die Ausnahme verursacht hat, ungefähr wie diese:

java.lang.IOException:  irgendeine Meldung
        at  irgendeine Java I/O-Methode
        at  SchwarzenPeterWeiterreichen.methodeC
        at  SchwarzenPeterWeiterreichen.methodeB
        at  SchwarzenPeterWeiterreichen.methodeA
        at  SchwarzenPeterWeiterreichen.main

In einem tatsächlichen Stack-Protokoll werden die Zeilennummern für jede Methode aufgeführt.

Jede Methode in der Kette kann auffangen

Jede Methode in der Kette der aufrufenden Methoden kann die Ausnahme auffangen. Das folgende ist eine andere Möglichkeit das Programm zu organisieren:

public class SchwarzenPeterWeiterreichen
{

  public static void methodeC() throws IOException
  {
     // einige I/O-Anweisungen
  }

  public static void methodeB() throws IOException
  {
     methodeC();
  }

  public static void methodeA()
  {
     try
     {
       methodeB();
     }
     catch ( IOException ex )
     {
       // Anweisungen um die Ausnahme zu handhaben
     }

  }

  public static void main ( String[] a )
  {
     methodeA();
  }

}

Eine Methode kann einige Ausnahmen behandeln und andere weiterreichen. Einige der Ausnahmen, die sie behandelt, können ihren Ursprung in Methoden haben, die sie aufruft, andere können ihren Ursprung in ihr selbst haben. Es kann so viele try/catch/finally-Strukturen in einer Methode geben wie notwendig sind. Die Logik der Fehlerbehandlung von industriell erprobten Programmen kann mehr Codezeilen benötigen als der "eigentliche" Zweck des Programms.

Eine Methode könnte mehrere Typen von geprüften Ausnahmen weiterreichen. Ihre throws-Klausel sieht so aus:

throws ExceptionClass1, ExceptionClass2, ...

Die Angabe von ungeprüften Ausnahmen in einer throws-Klausel ist optional.

FRAGE 8:

(Gedächtnistest: ) Ist eine ArithmeticException eine geprüfte Ausnahme?

Inhaltsverzeichnis