Assertions sind Zusicherungen, die zur Kontrolle des Programmablaufes verwendet werden.
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. Hierzu ist es neben den jeweiligen Aufrufen des assert
-Statements
im Quelltext noch notwendig, die Assertions zur Laufzeit zu
aktivieren. Dies hat den Vorteil, dass beim Produktiveinsatz des
Programms, die Assertions von der Laufzeitumgebung nicht
beachtet werden. Sie können somit problemlos bei der
Auslieferung im Programm verbleiben.
Assertions einbinden
Das Beispiel unten zeigt die Art und Weise, wie Assertions in
ein Programm eingebunden werden können.
In main()
erfolgt dort der zweimalige Aufruf der Methode gibEtwasAus()
,
die als Parameter ein Objekt vom Typ Object
erwartet. Innerhalb dieser Methode 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 zusammen mit einer 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 < 11
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 + " <= 10";
}
}
Assertions aktivieren
Um sie zu aktivieren, muss der Programmaufruf mit der Option -ea
gefolgt von einem Doppelpunkt erfolgen. Um z.B. Assertions
für eine Klasse zu aktivieren, so wird deren voll
qualifizierter Name nach dem Doppelpunkt genannt:
java -ea:mein.package.MeineKlasse
Wird der Schalter -ea
mit einem Argument und
anschließenden drei Punkten (...
) gesetzt, so
werden Assertions im spezifizierten Package und den
zugehörigen Unter-Packages aktiviert.
java -ea:mein.package...
Besteht das Argument lediglich aus drei Punkten (...
),
so werden Assertions im unbenannten Package des aktuellen
Arbeitsverzeichnisses aktiviert.
java -ea:...
Auch eine differenziertere Angabe ist möglich, indem
Assertions in einigen Klassen aktiviert und in anderen
deaktiviert werden. Zur Deaktivierung wird die Option -da
verwendet.
Im folgenden Beispiel wird die Klasse MeineKlasse
aufgerufen, wobei Assertions im Package mein.package.meinProg
und seinen Unter-Packages aktiviert und in der Klasse mein.package.meinProg.MeineKlasse
deaktiviert werden:
java -ea:mein.package.meinProg... -da:mein.package.meinProg.MeineKlasse
Wird das u.a. Programm in einem Package assertions
platziert (hierzu muss natürlich die Package-Angabe dem
abgebildeten Quelltext noch hinzugefügt werden), so
führt der Start des Programms mit den Optionen
-ea:assertions... -da:assertions.AssertionsClass
zu der Ausgabe
Exception in thread "main" java.lang.AssertionError: 1 <= 10 at assertions.Etwas.<init>(AssertionsClass.java:46) at assertions.AssertionsClass.main(AssertionsClass.java:29)
Quellen
https://docs.oracle.com/javase/7/docs/technotes/tools/solaris/java.html
Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.