Galileo Computing < openbook >
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.
Galileo Computing - Professionelle Buecher. Auch fuer Einsteiger.


Java ist auch eine Insel von Christian Ullenboom
Buch: Java ist auch eine Insel (Galileo Computing)
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 Ausnahmen, die nicht aufgefangen werden müssen: RuntimeException
gp 7.2.5 Harte Fehler: Error
gp 7.3 Werfen eigener Exceptions
gp 7.3.1 Typecast auf ein null-Objekt für eine NullPointerException
gp 7.3.2 Neue Exception-Klassen definieren
gp 7.4 Rückgabewerte bei ausgelösten Ausnahmen
gp 7.5 Stack-Aufruf analysieren
gp 7.6 Assertions
gp 7.6.1 Assertions in eigenen Programmen nutzen
gp 7.6.2 Assertions aktivieren
gp 7.6.3 Assertion-Nutzung in den Sun-Quellen
gp 7.7 Sicherheitsfragen mit dem SecurityManager klären
gp 7.7.1 Programm beenden


Galileo Computing

7.6 Assertionsdowntop

Kleine Änderungen in der Sprache Java gab es immer wieder. In Java 1.1 wurden innere Klassen eingeführt, in Java 1.3 das Schlüsselwort strict und in Java 1.4 das Schlüsselwort assert. Die Übersetzung des englischen Worts »assertion« zeigt die Bedeutung dieses Sprachkonstrukts: Behauptungen. Mit diesen werden innerhalb von Methoden Zusicherungen (Vor- und Nachbedingungen) aufgestellt, die deren korrekten Ablauf garantieren sollen. Ist eine Bedingung nicht erfüllt, wird ein Fehler ausgelöst, der darauf hinweist, dass im Programm etwas falsch gelaufen sein muss. Die ausgelösten Fehler sind vom Typ »Error« und nicht vom Typ »Exception« und sollten daher auch nicht aufgefangen werden, da eine nicht erfüllte Bedingung ein Programmierfehler ist.


Galileo Computing

7.6.1 Assertions in eigenen Programmen nutzendowntop

Assertions werden im Java-Quellcode mit folgender Zeile benutzt:

assert AssertConditionExpression [:MessageExpression];

Als Parameter geben wir eine Bedingung an, die an der entsprechenden Stelle im Quelltext erfüllt sein muss. Andernfalls wird das Programm beendet. Optional lässt ein zweiter Parameter einen Text zu, der beim Stacktrace als Nachricht in der Fehlermeldung erscheint.


Beispiel Eine Methode div() muss eine Zahl ungleich Null bekommen. Sollte irgendein Programmteil fehlerhaft sein und den Divisor doch mit Null belegen, muss ein Assert-Error erfolgen.

Listing 7.13 AssertKeyword.java

public class AssertKeyword
{
  public static int div( int divident, int divisor )
  {
    assert divisor != 0 : "Oh bitte keine Zahl durch null teilen.";
    return divident/divisor;
  }
  public static void main( String args[] )
  {
    System.out.println( "Quotient ist " + div(10, 2) );
    System.out.println( "Quotient ist " + div(10, 0) );
  }
}


Galileo Computing

7.6.2 Assertions aktivierendowntop

Damit das Programm kompiliert und ausgeführt werden kann, muss beim Compiler und bei der Laufzeitumgebung noch ein Schalter gesetzt werden. Ein Versuch, die Klasse mit JDK 1.4 ohne den passenden Schalter zu übersetzen, schlägt mit einer Fehlermeldung »not a statement« fehl.


Beispiel Übersetze die Klasse AssertKeyword.java mit Assertion-Fähigkeit

$ javac -source 1.4 AssertKeyword.java

Die Überprüfung von Assertions zur Laufzeit ist standardmäßig abgeschaltet. Dadurch entsteht kein Geschwindigkeitsverlust bei der Ausführung der Programme. Um Assertions zu aktivieren, muss die Laufzeitumgebung mit dem Schalter -ea (enable assertions) gestartet werden.


Beispiel Starte AssertKeyword mit Zusicherungen.

$ java -ea AssertKeyword

Abbildung
Hier klicken, um das Bild zu Vergrößern

Standardmäßig beachtet Eclipse keine assert-Anweisungen; sie müssen erst aktiviert werden. Dazu gibt es zwei Möglichkeiten: Zum einen Projektbezogen (unter Properties beim Projekt unter Java Compiler) oder global (unter Window • Preferences • Java im Baum Compiler). Dann müssen drei Einstellungen vorgenommen werden, damit das Klassenformat auch Assertions unterstützt.

Abbildung
Hier klicken, um das Bild zu Vergrößern


Galileo Computing

7.6.3 Assertion-Nutzung in den Sun-Quellentoptop

Seit der Version 1.4 und verstärkt in 1.4.1 nutzt Sun intensiv Assertions. Viele Klassen im nio-Paket sind durch assert-Anweisungen abgesichert. Das heißt gleichzeitig, dass die Klassen mit dem Schalter -source 1.4 übersetzt wurden, was wiederum bedeutet, dass der Schalter -target 1.4 einbezogen ist, der ein neues Dateiformat für Klassen vorschreibt (nun Version 48.0). Die Konsequenz der neuen Klassendatei ist, dass ältere JM die neuen Klassenversionen ablehnen und damit die neuen Klassen nicht mehr problemlos auf älteren Laufzeitumgebungen laufen. Dabei ist 1.3.x nun wirklich nicht alt.





Copyright (c) Galileo Press GmbH 2004
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, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de