Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

 << zurück
Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5
Java ist auch eine Insel

Java ist auch eine Insel
5., akt. und erw. Auflage
1454 S., mit CD, 49,90 Euro
Galileo Computing
ISBN 3-89842-747-1
gp Kapitel 7 Exceptions
  gp 7.1 Problembereiche einzäunen
    gp 7.1.1 Exceptions in Java mit try und catch
    gp 7.1.2 Eine Datei auslesen mit RandomAccessFile
    gp 7.1.3 Ablauf einer Ausnahmesituation
    gp 7.1.4 Wiederholung kritischer Bereiche
    gp 7.1.5 throws im Methodenkopf angeben
    gp 7.1.6 Abschließende Arbeiten mit finally
    gp 7.1.7 Nicht erreichbare catch-Klauseln
  gp 7.2 Die Klassenhierarchie der Fehler
    gp 7.2.1 Die Exception-Hierarchie
    gp 7.2.2 Oberausnahmen fangen
    gp 7.2.3 Alles geht als Exception durch
    gp 7.2.4 RuntimeException muss nicht aufgefangen werden
    gp 7.2.5 Harte Fehler: Error
  gp 7.3 Werfen eigener Exceptions
    gp 7.3.1 Mit throw Ausnahmen auslösen
    gp 7.3.2 Typecast auf ein null-Objekt für eine NullPointerException
    gp 7.3.3 Neue Exception-Klassen definieren
    gp 7.3.4 Geschachtelte Ausnahmen
  gp 7.4 Rückgabewerte bei ausgelösten Ausnahmen
  gp 7.5 Der Stack Trace
    gp 7.5.1 Stack Trace aus Throwable
    gp 7.5.2 Stack Trace aus Thread
  gp 7.6 Assertions
    gp 7.6.1 Assertions in Java
    gp 7.6.2 Assertions in eigenen Programmen nutzen
    gp 7.6.3 Assertions aktivieren


Galileo Computing

7.5 Der Stack Tracdowntop

Die virtuelle Maschine merkt sich auf einem Stapel, welche Methode welche andere Methode aufgerufen hat. Diese Geschichte nennt sich Stack Trace. Wenn also die statische main()-Funktion die Funktion println() aufruft, und die wiederum print(), so sieht der Stapel zum Zeitpunkt von print() so aus:

print
println
main

Galileo Computing

7.5.1 Stack Trace aus Throwable  downtop

Ein Stack Trace ist im Fehlerfall nützlich, denn so lässt sich ablesen, wie die Aufruf-Geschichte war. Abrufbar ist ein Stack Trace daher bei den Fehler-Objekten, deren Basisklasse Throwable ist.


class java.lang.  Throwable
  implements Serializable

gp  void printStackTrace() Schreibt das Throwable und anschließend den Stack-Inhalt in den Standardausgabestrom.
gp  void printStackTrace( PrintStream s ) Schreibt das Throwable und anschließend den Stack-Inhalt in den angegebenen PrintStream.
gp  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 zum Zeitpunkt eines Methodenaufrufs aufgebaute Stack 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.14   GetStackTrace.java

public class GetStackTrace
{
  public static void showTrace()
  {
    for ( StackTraceElement trace : new Throwable().getStackTrace() )
      System.out.println( trace );
  }
  public static void m( int n )
  {
    if ( n == 0 )
      showTrace();
    else
      m( n – 1 );
  }
  public static void main( String[] args )
  {
    m( 2 );
  }
}

Das Programm gibt aus:

GetStackTrace.showTrace(GetStackTrace.java:5)
GetStackTrace.m(GetStackTrace.java:12)
GetStackTrace.m(GetStackTrace.java:14)
GetStackTrace.m(GetStackTrace.java:14)
GetStackTrace.main(GetStackTrace.java:19)

Galileo Computing

7.5.2 Stack Trace aus Thread  toptop

Seit Java 5 bietet die Thread-Klasse mit zwei Methoden eine Alternative, auch ohne neue Exception-Objekte an die StackTraceElemente zu kommen:


class java.lang.  Thread
  implements Runnable

gp  static Map<Thread,StackTraceElement[]> getAllStackTraces() Die statische Methode liefert von allen Threads in einem Assoziativspeicher ein Feld von StackTraceElement-Objekten.
gp  StackTraceElement[] getStackTrace() Liefert den Stack-Trace für den Thread.

Beispiel   Finde heraus, in welcher Methode wir gerade stehen:
StackTraceElement e = Thread.currentThread().getStackTrace()[2];
System.out.println( e.getMethodName() );
Intern könnte sich durchaus die Position verschieben!

 << zurück




Copyright © Galileo Press GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de