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 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.