Assertions sind Zusicherungen, die zur Kontrolle des Programmablaufes verwendet werden.

Sie werden innerhalb von Methoden verwendet, um die gewünschten Bedingungen zur Laufzeit sicherzustellen.

So können z.B. die Korrektheit von übergebenen Werten und Typen oder der Wertebereich von Rückgaben überprüft werden. Wenn die erwarteten Ergebnisse nicht eintreten, wird bei aktivierten Assertions ein AssertionError geworfen. Hierbei ist es neben den jeweiligen Aufrufen des assert-Statements im Quelltext noch notwendig, die Assertions zur Laufzeit zu aktivieren. Dies hat den Vorteil, dass im 'Normalfall', beim Produktiveinsatz des Programms, die Assertions von der Laufzeitumgebung nicht beachtet werden. Sie können somit problemlos bei der Auslieferung im Programm verbleiben.

>

Assertions aktivieren

Um sie zu aktivieren, muss der Programmaufruf mit dem Schalter -ea erfolgen:

java -ea meineKlasse

Dies kann auch differenzierter erfolgen, indem Assertions in einigen Klassen aktiviert und in anderen deaktiviert werden. Zur Deaktivierung wird der Schalter -da verwendet. Im folgenden Beispiel wird das Programm Bar aufgerufen, wobei Assertions im Package de.yourwebs.meinProg aktiviert und in der Klasse de.yourwebs.meinProg.Foo deaktiviert werden:

java -ea:de.yourwebs.meinProg... -da:de.yourwebs.meinProg.Foo Bar

Assertions einbinden

Das Beispiel unten zeigt die Art und Weise, wie Assertions in ein Programm eingebunden werden können.
In main() erfolgt der zweimalige Aufruf einer Methode, die als Parameter ein Objekt vom Typ Object erwartet. Innerhalb der Methode gibEtwasAus(Object e) wird der übergebene Wert daraufhin geprüft, ob er vom Typ Etwas ist. Ist dies der Fall, so wird der Wert einer Variablen ausgegeben und die Methode wird beendet. Im anderen Fall wird ein AssertionError mit einem entsprechenden Hinweis geworfen. Dies verdeutlicht die notwendige Syntax für den Aufruf:

assert boolscher Ausdruck : Wert

Wert wird mit der Fehlermeldung ausgegeben, wenn der boolsche Ausdruck false ist. Für diesen kann somit z.B. auch ein Methodenaufruf stehen, der einen boolschen Rückgabewert besitzt.
Der Konstruktor von Etwas bekommt im Beispiel einen int-Wert übergeben, der ebenfalls geprüft wird: Ist dieser kleiner 11, so wird wiederum ein AssertionError ausgelöst und das Programm terminiert an dieser Stelle. Der o.a. Fall tritt im Beispiel somit gar nicht ein, da bei der Objektbildung ein Wert von 1 übergeben wird.

public class AssertionsClass {

    public static void main(String[] args) {
        gibEtwasAus(new Etwas(1)); // wirft AssertionError in Etwas() da 1 < 10
        gibEtwasAus(new Object());
    }

    private static void gibEtwasAus(Object e){
        if(e instanceof Etwas){
            System.out.println(((Etwas) e).etwas);
            return;
        }
        assert false : "Dateityp ist nicht 'Extras'";
    }
}

class Etwas {
    int etwas;
    public Etwas(int e){
        this.etwas = e;
        assert etwas > 10 : etwas + " ist kleiner oder gleich 10";
    }
}