Reservierte Schlüsselwörter in Java – Assertions

Obwohl dieses Thema ein absolut einführendes Thema in die Sprache Java ist, kann es nicht Schaden mal eine Auflistung aller reservierten Schlüsselwörter (Keywords) in Java zu sehen. Schlüsselwörter sind nicht als Bezeichner zulässig weil sie von dem Compiler besonders behandelt werden.

In der folgenden Tabelle sind alle in Java reservierten Schlüsselwörter zu sehen, die man als Java Entwickler eigentlich alle kennen und deuten können sollte:

abstract continue for new switch
assert default goto package synchronized
boolean do if private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while
Assertions

In Java 1.4 kam das Schlüsselwort assert hinzu, welches oft nicht wirklich bekannt oder meiner Meinung nach zu wenig genutzt wird. Die sogenannten Assertions sind dazu da um Ausdrücke (Expressions) zur Laufzeit auf wahr oder falsch zu prüfen. Als Programmierer von Programmlogik gibt es Stellen bei denen man z.B. ausschließen kann, dass ein bestimmter Wert vorkommt oder der nie erreicht werden kann. Kommt er dennoch vor muss etwas generell im Programm falsch gelaufen sein. Solche Stellen kann man mit dem Schlüsselwort assert abprüfen. Dabei gibt es zwei Varianten wie man assert verwenden kann:

assert Expression;
assert Expression : MessageExpression;

Schlägt die Expression fehl (ergibt der Ausdruck false) bricht das Programm mit einem java.lang.AssertionsError ab. Hat man zusätzlich zur Expression eine MessageExpression angegeben wird dieser Text im Stacktrace mit ausgegeben.

Man sollte allerdings beachten Assertions nicht mit einer If-Abfrage zu verwechseln. Assertions sollen nur helfen aufgestellte Behauptungen an bestimmten Positionen im Code zu verifizieren. Per Defaulteinstellung im Java Interpreter sind Assertions ausgeschaltet. Um sie zu aktivieren muss die Laufzeitumgebung mit dem Parameter -ea gestartet werden (z.B. java -ea myJavaProgram).

Ein schönes Beispiel das Schlüsselwort assert zu verwenden ist die switch Anweisung. Hat man ein switch Statement wlelches alle vorkommenden Möglichkeiten abhandelt kann man in den default Case ein assert false einbauen. Dieser Teil dürfte eigentlich nie erreicht werden:

EnumUserRoles role = loggedInUser.getRole();
switch(role) {
  case Admin:
    System.out.println("Angemeldet als Administrator");
    break;

  case User:
    System.out.println("Angemeldet als Benutzer");
    break;

  default:
    assert false : "User kann nur Admin oder Benutzer sein!";
    break;
}

Ist nun bei einem User die Rolle nicht gesetzt oder würde man im Nachhinein eine weitere Rolle einführen, diese aber nicht in diesem switch-Block behandeln schlägt die Assertion im default-Case an und das Programm bricht ab. Man hat somit sofort die Ursache für den Fehler gefunden und muss nicht lange herumsuchen um eine später den Grund der NullPointerException zu finden weil man loggedInUser.getRole().equals(EnumUserRoles.Admin) aufgerufen hat.

Im Übrigen sieht man in diesem Beispiel noch die Verwendung der Schlüsselwörter switch, case, default und break. Obwohl false auch Beispielcode hervorgehoben und wie auch true und null reserviert sind, gelten sie nicht als Schlüsselwörter sondern als “Literals” (Ausdrücke).

Ausführliche Informationen über die Verwendung von Assertions findet man auch auf den offiziellen Seiten von Sun unter dem Titel “Programming With Assertions“. [Update 21.01.] Auch noch sehr passend zu dem dem Schlüsselwort assert ist der Artikel “Assertions” auf java-blog-buch.de, über den ich gerade gestolpert bin.

Als letzte Information noch der Hinweis, dass das Schlüsselwort enum erst mit Java 5 Einzug erhalten hat.

Tags: , , ,

Wenn du Fragen oder Anregungen zum Post hast, dann hinterlasse doch ein Kommentar oder wenn du weiterhin Artikel von Javathreads lesen möchtest, dann abonniere den RSS Feed und sehe direkt in deinem Feed Reader die nächsten Artikel.

Ähnliche Artikel, die dich interessieren könnten:
    None Found
Kommentare

Es heisst hier, dass per Defaulteinstellung Assertions im im Compiler ausgeschaltet sind, aber müsste es nicht heissen, dass Assertions defaultmässig im Interpreter ausgeschaltet sind, denn sonst könnte man sie ja nicht mittels dem Schalter -ea aktvieren, wenn der Compiler sie nicht in den Bytecode übernehmen würde.

Oh, natürlich müsste es so heißen! Man gibt der Laufzeitumgebung, also dem Interpreter, mit ob Assertions aktiviert oder deaktiviert sind.

Eieiei, welch ein böser Fehler! Vielen Dank für den Hinweis ich habe es direkt im Text korrigiert. =)

Man musste beim Kompilieren lediglich darauf achten, dass man mit mindestens Java 1.4 als Sourceangabe (javac -source 1.4) kompiliert, weil sonst ‘assert’ nicht als Schlüsselwort erkannt wird. Aber in Zeiten von Java 1.4 und Java 5 ist das eigentlich kaum noch von Belang.

[...] Ausdruck immer true ergeben. Mehr zu Java Assertions kann auch in dem javathreads Artikel “Reservierte Schlüsselwörter in Java – Assertions” sowie im Java Blog Buch gefunden werden. Tests [...]

Hinterlasse ein Kommentar