7.5 Stack-Aufruf analysieren
Immer dann, wenn wir eine Exception haben, handelt es sich um eine Unterklasse von Throwable. Jedes der Ausnahme-Objekte liefert Informationen über den Grund der Ausnahme mit.
class java.lang.Throwable
implements Serializable
|
|
void printStackTrace()
Schreibt das Throwable und anschließend den Stack-Inhalt in den Standardausgabestrom. |
|
void printStackTrace( PrintStream s )
Schreibt das Throwable und anschließend den Stack-Inhalt in den angegebenen PrintStream. |
|
void printStackTrace( PrintWriter s )
Schreibt das Throwable und anschließend den Stack-Inhalt in den angegebenen PrintWriter. |
Doch auch ohne Ausnahme bekommen wir einen Aufruf-Stack. Der Stack, der zum Zeitpunkt eines Methodenaufrufs aufgebaut wurde, lässt sich mit einer Throwable-Funktion erfragen. Damit lassen sich Schlüssel über den Programmablauf rekonstruieren.
StackTraceElement trace[] = new Throwable().getStackTrace();
Wir erkennen, dass jede Methode durch ein StackTraceElement-Objekt repräsentiert ist. Dies erlaubt den Zugriff auf den Dateinamen, in dem die Methode definiert wurde, die Programmzeile, den Methodennamen und die Information darüber, ob die Methode nativ ist oder nicht.
Sehen wir uns das Beispiel eines Programms an, welches mehrere Methoden aufruft. Im letzten Schritt wollen wir den Stack ausgeben. Ein StackTraceElement definiert eine toString()-Methode, die alle Informationen abgibt.
Listing 7.12 GetStackTrace.java
public class GetStackTrace
{
public static void showTrace()
{
StackTraceElement trace[] = new Throwable().getStackTrace();
for ( int i = 0; i < trace.length; i++ )
{
StackTraceElement ste = trace[i];
System.out.println( ste );
}
}
public static void m( int n )
{
if ( n == 0 )
{
showTrace();
return;
}
m( n - 1 );
}
public static void main( String args[] )
{
m( 2 );
}
}
Das Programm gibt aus:
GetStackTrace.showTrace(GetStackTrace.java:5)
GetStackTrace.m(GetStackTrace.java:18)
GetStackTrace.m(GetStackTrace.java:21)
GetStackTrace.m(GetStackTrace.java:21)
GetStackTrace.main(GetStackTrace.java:27)
|