Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.
 
Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Imperative Sprachkonzepte
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Eigene Klassen schreiben
6 Objektorientierte Beziehungsfragen
7 Ausnahmen müssen sein
8 Äußere.innere Klassen
9 Besondere Typen der Java SE
10 Generics<T>
11 Lambda-Ausdrücke und funktionale Programmierung
12 Architektur, Design und angewandte Objektorientierung
13 Die Klassenbibliothek
14 Einführung in die nebenläufige Programmierung
15 Einführung in Datenstrukturen und Algorithmen
16 Einführung in grafische Oberflächen
17 Einführung in Dateien und Datenströme
18 Einführung ins Datenbankmanagement mit JDBC
19 Einführung in <XML>
20 Testen mit JUnit
21 Bits und Bytes und Mathematisches
22 Die Werkzeuge des JDK
A Java SE Paketübersicht
Stichwortverzeichnis

Download:
- Beispielprogramme, ca. 20,0 MB
- Übungsaufgaben, ca. 1,8 MB
- Musterlösungen, ca. 0,8 MB

Buch bestellen
Ihre Meinung?

Spacer
<< zurück
Java ist auch eine Insel von Christian Ullenbloom
Das umfassende Handbuch
Buch: Java ist auch eine Insel

Java ist auch eine Insel
Rheinwerk Computing
1306 Seiten, gebunden, 11. Auflage
49,90 Euro, ISBN 978-3-8362-2873-2
Pfeil 7 Ausnahmen müssen sein
Pfeil 7.1 Problembereiche einzäunen
Pfeil 7.1.1 Exceptions in Java mit try und catch
Pfeil 7.1.2 Eine NumberFormatException auffangen
Pfeil 7.1.3 Eigenschaften vom Exception-Objekt
Pfeil 7.1.4 Wiederholung abgebrochener Bereiche *
Pfeil 7.1.5 Mehrere Ausnahmen auffangen
Pfeil 7.1.6 Ablauf einer Ausnahmesituation
Pfeil 7.1.7 throws im Methodenkopf angeben
Pfeil 7.1.8 Abschlussbehandlung mit finally
Pfeil 7.2 RuntimeException muss nicht aufgefangen werden
Pfeil 7.2.1 Beispiele für RuntimeException-Klassen
Pfeil 7.2.2 Kann man abfangen, muss man aber nicht
Pfeil 7.3 Die Klassenhierarchie der Fehler
Pfeil 7.3.1 Die Exception-Hierarchie
Pfeil 7.3.2 Oberausnahmen auffangen
Pfeil 7.3.3 Schon gefangen?
Pfeil 7.3.4 Alles geht als Exception durch
Pfeil 7.3.5 Zusammenfassen gleicher catch-Blöcke mit dem multi-catch
Pfeil 7.4 Harte Fehler – Error *
Pfeil 7.5 Auslösen eigener Exceptions
Pfeil 7.5.1 Mit throw Ausnahmen auslösen
Pfeil 7.5.2 Vorhandene Runtime-Fehlertypen kennen und nutzen
Pfeil 7.5.3 Parameter testen und gute Fehlermeldungen
Pfeil 7.5.4 Neue Exception-Klassen deklarieren
Pfeil 7.5.5 Eigene Ausnahmen als Unterklassen von Exception oder RuntimeException?
Pfeil 7.5.6 Ausnahmen abfangen und weiterleiten *
Pfeil 7.5.7 Aufruf-Stack von Ausnahmen verändern *
Pfeil 7.5.8 Präzises rethrow *
Pfeil 7.5.9 Geschachtelte Ausnahmen *
Pfeil 7.6 Automatisches Ressourcen-Management (try mit Ressourcen)
Pfeil 7.6.1 try mit Ressourcen
Pfeil 7.6.2 Die Schnittstelle AutoCloseable
Pfeil 7.6.3 Mehrere Ressourcen nutzen
Pfeil 7.6.4 try mit Ressourcen auf null-Ressourcen
Pfeil 7.6.5 Unterdrückte Ausnahmen *
Pfeil 7.7 Besonderheiten bei der Ausnahmebehandlung *
Pfeil 7.7.1 Rückgabewerte bei ausgelösten Ausnahmen
Pfeil 7.7.2 Ausnahmen und Rückgaben verschwinden – das Duo return und finally
Pfeil 7.7.3 throws bei überschriebenen Methoden
Pfeil 7.7.4 Nicht erreichbare catch-Klauseln
Pfeil 7.8 Den Stack-Trace erfragen *
Pfeil 7.8.1 StackTraceElement
Pfeil 7.8.2 printStackTrace(…)
Pfeil 7.8.3 StackTraceElement vom Thread erfragen
Pfeil 7.9 Assertions *
Pfeil 7.9.1 Assertions in eigenen Programmen nutzen
Pfeil 7.9.2 Assertions aktivieren
Pfeil 7.10 Zum Weiterlesen
 
Zum Seitenanfang

7.8Den Stack-Trace erfragen * Zur vorigen ÜberschriftZur nächsten Überschrift

Bei jedem Methodenaufruf legt die JVM eine Kennung auf einen Aufrufstapel (eng. call stack). Um den Aufrufstapel zu einem bestimmten Zeitpunkt sichtbar zu machen, lässt sich ein Stack-Trace erfragen. Der Stack-Trace ist dabei allerdings nicht der Aufrufstapel selbst – Java setzt einige Abstraktionen über Maschinencode und gibt die internen Vorgänge nicht preis –, sondern eine Liste von StackTraceElement-Objekten. Jedes dieser Objekte bietet Zugriff auf den Namen der Datei, in der die Methode deklariert wurde, auf die Programmzeile, den Methodennamen und die Information darüber, ob die Methode nativ ist oder nicht.

Warum sind Stack-Traces nun nützlich? Einige Antworten:

  • Strack-Traces sind unverzichtbare Aussagen im Fehlerfall und beim Debugging, denn Entwickler möchten gerne wissen, welchen Weg Aufrufe genommen haben.

  • Sie helfen beim Erkennen von Rekursionen. Bei einer Rekursion ruft eine Methode direkt oder indirekt sich selbst auf. Das allein ist nicht problematisch, aber wenn eine Abbruchbedingung fehlt, so kommt es zu einer Endlosrekursion, was zum Platzen des Stack-Speichers führt und letztendlich zu einem StackOverflowError. Eine Untersuchung zur Laufzeit kann rekursive Aufrufe identifizieren und den Thread gleich abbrechen, anstatt dass der wild gewordene Thread etwa in jedem Methodenaufruf noch Speicher alloziert und es dann mit einem OutOfMemoryError noch schlimmer kommt.

  • Methoden können durch Stack-Inspektionen Sicherheitsprüfungen durchführen, etwa nachschauen, ob ein Aufruf überhaupt autorisiert ist. Die Java-Security basiert auf dieser Arbeitsweise, und ein Access Controller arbeitet genau für diesen Test den Stack ab.

 
Zum Seitenanfang

7.8.1StackTraceElement Zur vorigen ÜberschriftZur nächsten Überschrift

Java bietet unterschiedliche Möglichkeiten, einen Stack-Trace zu erfragen und somit an eine Sammlung von StackTraceElement-Objekten zu kommen, die die Aufrufgeschichte zeigen:

  • Bei einer ausgelösten Ausnahme verrät die Methode getStackTrace() vom Throwable-Objekt den aktuellen Stack-Trace.

  • Ein Thread-Objekt gibt seine eigene Aufrufhierarchie mit getStackTrace() an. Jeder Thread hat einen eigenen Aufrufstapel.

  • Die statische Methode Thread.getAllStackTraces() liefert für alle Threads die aktuellen Stack-Traces.

Die genannten Methoden liefern Sammlungen von StackTraceElement-Objekten mit folgenden Informationen:

final class java.lang.StackTraceElement
implements Serializable

  • StringgetClassName()

  • StringgetFileName()

  • intgetLineNumber()

  • StringgetMethodName()

  • booleanisNativeMethod()

Bedauerlicherweise fehlen wichtige Informationen, wie etwa Zeitpunkte.

 
Zum Seitenanfang

7.8.2printStackTrace(…) Zur vorigen ÜberschriftZur nächsten Überschrift

Eine Methode, die in den Buchbeispielen schon oft zum Einsatz kam, war printStackTrace(): Sie gibt auf dem Bildschirm den Stack-Trace aus. Die Methode printStackTrace() stammt von Throwable und ist überladen; die Signaturen sind: printStackTrace(), printStackTrace(PrintStream) und printStackTrace(PrintWriter). Intern ruft printStackTrace() einfach printStackTrace(System.err) auf, sodass der Stack-Trace automatisch auf den Fehlerausgabekanal kommt.

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 Aufruf-Stack in den angegebenen PrintStream.

  • void printStackTrace(PrintWriter s)
    Schreibt das Throwable und anschließend den Aufruf-Stack in den angegebenen PrintWriter.

 
Zum Seitenanfang

7.8.3StackTraceElement vom Thread erfragen Zur vorigen ÜberschriftZur nächsten Überschrift

Sehen wir uns ein Beispielprogramm an, das mehrere Methoden aufruft und dann den Stack-Trace ausgibt:

Listing 7.34GetStackTrace.java

public class GetStackTrace {

public static void showTrace() {
for ( StackTraceElement trace : Thread.currentThread().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 );
}
}

Ein StackTraceElement deklariert eine toString()-Methode, und die Ausgabe sieht dann so aus:

java.lang.Thread.getStackTrace(Thread.java:1567)
GetStackTrace.showTrace(GetStackTrace.java:4)
GetStackTrace.m(GetStackTrace.java:10)
GetStackTrace.m(GetStackTrace.java:12)
GetStackTrace.m(GetStackTrace.java:12)
GetStackTrace.main(GetStackTrace.java:16)

class java.lang.Thread
implements Runnable

  • static Map<Thread,StackTraceElement[]> getAllStackTraces()
    Die statische Methode liefert von allen Threads in einem Assoziativspeicher ein Feld von StackTraceElement-Objekten.

  • StackTraceElement[] getStackTrace()
    Liefert den Stack-Trace für den Thread.

[zB]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 (hier im Stack an Stelle zwei) verschieben!

Realitätstest

Der Stack-Trace, den Java bietet, ist relativ arm an Informationen, und die Standardausgabe über Throwables printStrackTrace(…) ist unübersichtlich. Zudem fehlen spannende Informationen wie Zeitpunkte, und ein Thread.getAllStackTraces() ist bei vielen Threads und tiefen Aufrufhierarchien sehr langsam. Summa summarum: Ein guter Debugger bzw. ein Analysetool mit Zugriff auf die JVM-Eigenschaften ist für die ernsthafte Entwicklung unumgänglich.

 


Ihr Kommentar

Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.

>> Zum Feedback-Formular
<< zurück
 Zum Katalog
Zum Katalog: Java ist auch eine Insel Java ist auch eine Insel
Jetzt bestellen

 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchempfehlungen
Zum Katalog: Java SE 8 Standard-Bibliothek
Java SE 8 Standard-Bibliothek


Zum Katalog: Professionell entwickeln mit Java EE 7
Professionell entwickeln mit Java EE 7


Zum Katalog: Schrödinger programmiert Java
Schrödinger programmiert Java


Zum Katalog: Einführung in Java
Einführung in Java


Zum Katalog: Programmieren lernen mit Java
Programmieren lernen mit Java


Zum Katalog: Apps entwickeln für Android 5
Apps entwickeln für Android 5


Zum Katalog: Apps entwickeln mit Android Studio
Apps entwickeln mit Android Studio


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo

 
 


Copyright © Rheinwerk Verlag GmbH 2016
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.

 
Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de