06.09 Assertions

Durch die Einführung des Schlüsselworts assert in Java 1.4 wurde dem Entwickler eine Möglichkeit an die Hand gegeben, mit der er seine Anwendung auf Programmfehler besser testen kann. Mit assert wird ein Ausdruck auf Richtigkeit geprüft (ähnlich wie bei einer if-Abfrage). Falls dieser false ergibt, wird ein Error (keine Exception) erzeugt. Das besondere an Assertions (deutsch: Behauptungen) ist, dass sie zur Laufzeit nicht mehr berücksichtigt werden müssen.

Syntax

Um eine Assertion einzusetzen, verwenden Sie das Schlüsselwort assert in einer Methode Ihrer Wahl. Anschließend folgt die Bedingung der Assertion und optional (getrennt durch einen Doppelpunkt) eine Fehlermeldung, die in den StackTrace des AssertionError mit aufgenommen werden soll.

assert Bedingung;
assert Bedingung : "Fehlermeldung";

Einsatzorte

Sie sollten Assertions immer dann verwenden, wenn Sie davon ausgehen, dass nur bestimmte Zustände – definiert durch die Programmlogik – an einer bestimmten Stelle in Ihrem Programm möglich sein können. Wenn durch einen Fehler des Programmierers an so einer Stelle doch ein nicht annehmbarer Zustand auftritt, können Sie mit Assertions darauf aufmerksam gemacht werden. Ein Beispiel:

Sie haben einen Algorithmus, der eine Zahl zwischen eins und drei zurückgibt. Natürlich ist der Rückgabewert der Algorithmus-Methode ein int und kann somit theoretisch alle Zahlen im Wertebereich eines Integers generieren. Mit einem assert können Sie nun beim Testen des Algorithmus überprüfen, ob wirklich nur Zahlen zwischen eins und drei zurückgegeben werden – also ob der Algorithmus richtig funktioniert.

public class AssertTest {

  public static void main(String args[]) {
    callIt();
  }

  private static int algorithm() {
    int retValue = 0;
    // do something cool with ratValue
    return retValue; // must be between one and three
  }

  private static void callIt() {

    int value = algorithm();
    assert value > 0 && value < 4 : "error @ alogrithm";
    // do something cool with value
  }
}&#91;/sourcecode&#93;

Auch in Kombination mit dem Testing-Tool <a href="#" title="In Arbeit">JUnit</a> werden Assertions exzessiv verwendet.

<strong>Ausführen von Programmen mit Assertions</strong>

Kompilieren lassen sich solche Klassen seit Java 1.4 wie ganz gewöhnliche Klassen über den <code>javac</code>-Befehl. Wenn Sie das obige Programm aber ganz gewöhnlich ausführen, erhalten Sie keine Fehlermeldung. Dies ist auf die anfangs getätigte Aussage zurückzuführen, dass Assertions beim Ausführen des Programms nicht mehr berücksichtigt werden. Sie müssen deshalb bei Ihrem <code><em>java AssertTest</em></code> Aufruf noch explizit angeben, dass Assertions berücksichtigt werden sollen. Dies definieren Sie mit der Übergabe des Parameters <code><em>-ea</em></code> => <code><em>java -ea AssertTest</em></code>. Ohne diesen Parameter werden Assertions nicht berücksichtigt, Sie können also bei der Auslieferung Ihres Programms alle <code>assert</code>-Statements im Code belassen. Durch das (voreingestellte) Ignorieren der Assertions verliert Ihr Programm durch den Einsatz von Assertions auch nicht an Performance.

Sehen wir uns jetzt noch kurz die Ausgabe bei aktivierten Assertions und einem fehlerhaften Rückgabewert unserer <code>alogrithm</code>-Methode an:

<pre><code>Exception in thread "main" java.lang.AssertionError: error @ alogrithm
        at AssertTest.callIt(AssertTest.java:16)
        at AssertTest.main(AssertTest.java:4)</code></pre>

<strong>Hinweise zur Verwendung von Assertions</strong>

Da Assertions nicht bei der gewöhnlichen Ausführung Ihres Programms berücksichtigt werden, sollten Sie Assertions nicht für Dinge verwenden, die zwingend zur Laufzeit des Programms benötigt werden - wie z. B. Validierungen. 

Ein weiterer Einsatzort für Assertions ist, wenn sich Variablen in der Entwicklungsumgebung von denen im Echt-System unterscheidet. So besteht die Möglichkeit nur bei der Entwicklung, also wenn das Programm mit dem <code><em>-ea</em></code> Parameter gestartet wurde, gewisse Variablen zu initialisieren.

public class AssertionInit {
  public static void main(String args[]) {

    String str = null;
    assert (str = "Hallo Welt") != null;
    System.out.println(str);
  }
}

Beachten Sie, dass in diesem Fall bei der Ausführung mit dem Parameter -ea die Ausgabe Hallo Welt erscheint. Bei der Ausführung der Klasse ohne den -ea-Parameter, würde hingegen null ausgegeben werden.

3 Replies to “06.09 Assertions”

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.