Assertions

<-- zurck zur Startseite | <- eine Seite vor | eine Seite weiter ->

  1. Was sind Assertions?
  2. (De-)Aktivieren von Assertions
  3. Tips zur Verwendung

1. Was sind Assertions?

Assertions bzw. assert-Anweisungen dürften C/C++-Programmierern sicher bekannt sein. In Java waren sie bereits für das JDK1.0 geplant, wurden aber erst mit dem JDK1.4 fest implementiert. Für Java-Programmierer also etwas relativ neues. Was sind aber Assertions? Assertions sind in erster Linie eine Hilfe für Programmierer. Sie haben die Aufgabe, an bestimmten Stellen des Programms zu kontrollieren, ob alles so läuft, wie vom Programmierer vorgesehen. Syntax:

assert Ausdruck
assert Ausdruck1 : Ausdruck2

Sehen wir uns zunächst die erste Variante an: der Ausdruck hinter dem Schlüsselwort assert muss in jedem Fall einen booleschen Wert zurückliefern, andernfalls weigert sich der Compiler, das Programm zu übersetzen. So weit, so langweilig. Ich hatte erwähnt, dass Assertions dem Programmierer bei der Programmkontrolle helfen. Das Interessante bei Assertions ist jetzt, dass der Ausdruck deshalb in der Regel so gewählt wird, dass er bei korrekter Arbeitsweise des Programms immer TRUE ergibt (man spricht deshalb auch von Invarianten. Arbeitet das Programm nicht korrekt und liefert der Ausdruck FALSE zurück, dann wird ein AssertionError ausgelöst. Ein Error bezeichnet, wie wir bereits wissen, einen Fehler, der nicht mehr gesteuert werden kann und deshalb zum Abbrechen des Programms führt.
Die zweite Variante erlaubt es, hinter einem Doppelpunkt eine zweite Anweisung an die assert-Anweisung zu übergeben: diese setzt den Fehlertext (kann aber selbst von beliebigem Typ sein, wobei ein String oft am meisten Sinn macht). Fehlt die zweite Anweisung, bleibt der Fehlertext leer.

public class AssertionTest {

  public static String convertTime(int hours, int minutes) {
    assert hours<=24 && hours>=0;
    assert minutes<=60 && minutes>=0 : "Minuten sollen zwischen 0 und 60 liegen!";
    String suffix;
    if (hours>12)
       suffix = " p.m.";
    else
       suffix = " a.m.";
    int newHour = hours%12;
    assert newHour<=12 && newHour>=0 : "Fehler in der Berechnung";
    return newHour+":"+minutes+suffix;
  }

  public static void main(String[] args) {
    System.out.println(convertTime(22, 35));
  }

}

In diesem Beispiel sollen die Assertions die Regelmäßigkeit der erstellten Funktion gewährleisten. Die Methode "convertTime" soll Angaben zu Stunden und Minuten annehmen und daraus einen String kreieren, der die Uhrzeit im anglo-amerikanischen Format zurückgibt. Dazu wird zuallererst überprüft, ob die übergebene Stundenzahl auch wirklich zwischen 0 und 24 liegt. Ebenso wird bei den Minuten überprüft, ob sie zwischen 0 und 60 liegen, allerdings wurde hier noch zusätzlich ein Fehlertext für den Fehlerfall spezifiziert (hinter dem Doppelpunkt). Ist alles in Ordnung, wird der Rest der Methode ausgeführt. Zum Schluss wird noch überprüft, ob die neu ermittelte Stundenzahl zwischen 0 und 12 liegt. Dies dient dem Programmierer zur Kontrolle, ob der in der Methode angewandte Algorithmus auch korrekt arbeitet (dass der Algorithmus in diesem Fall extrem simpel ist, braucht uns nicht stören, es dient der Demonstration).

nach oben

2. (De-)Aktivieren von Assertions

Wie schon erwähnt, existieren Assertions in Java erst seit dem JDK1.4. Bei älteren Compilern würde obiges Programm mit einem Syntaxfehler abbrechen. Verwendet man den Java-Compiler des JDK1.4, passiert etwas Merkwürdiges: der Compiler weigert sich, das Programm in Byte-Code zu übersetzen, mit der Begründung, dass assert ein reserviertes Schlüsselwort sei. Um Quellcode mit assert-Anweisungen kompilieren zu können, muss dem Compiler beim Aufruf eine zusätzliche Option übergeben werden:

javac -source 1.4 AssertionTest.java

Vor der Angabe der Quelltextdatei muss also -source 1.4 geschrieben werden. Man sagt auch, dass der "Flag" -source auf 1.4 gesetzt wird.
Leider ist es damit noch nicht ganz getan: auch das Starten das Java-Interpreters verlangt nun die Angabe eines zusätzlichen "Flags". Damit wird der JVM klar gemacht, ob die assert-Anweisungen beachtet werden sollen oder nicht. Sollen sie beachtet werden, muss beim Aufruf des Interpreters vor dem Namen der .class-Datei der Flag -enableassertions oder wahlweise -ea gesetzt werden. Sollen sie deaktiviert werden, übergibt man -disableassertions oder -da. Um unser Programm nun mit aktivierten assert-Anweisungen auszuführen, tippen wir einen der beiden Aufrufe ein:

java -enableassertions AssertionTest
java -ea AssertionTest

Um die assert-Anweisungen zu deaktivieren, wählt man einen der beiden folgenden Aufrufe:

java -disableassertions AssertionTest
java -da AssertionTest

nach oben

3. Tips zur Verwendung

Bleibt noch die dringende Frage zu klären, wozu überhaupt Assertions gut sein sollen. Deswegen ein kleiner Leitfaden an diese Stelle.

Assertions sind sinnvoll, wenn

Assertions sollten vermieden werden, wenn

nach oben