Assertions

Aus Programmieren-Wiki
🚧 Diese Seite befindet sich in Bearbeitung 🚧
🤓 Diese Seite ist eine Bewertungsrichtlinie, die ab Blatt 2 annotiert und ab Blatt 3 abgezogen wird. 🤓

Beschreibung

Einführung in Assertions

In ihrer simpelsten Form sind Assertions "Verspechen" an ein zugrundeliegendes Program. Oracle führt hierbei folgendes Beispiel an:

"Gehen wir davon aus, dass wir eine Methode haben, die die Geschwindigkeit eines Partikels ausrechnet. Dann versprechen wir, dass die berechnete Geschwindigkeit immer kleiner als die Lichtgeschwindigkeit ist."

Genau dieses Versprechen lässt sich durch eine Assert-Klausel durchsetzen.

Je nach Ausführungs-weise und -parametern, können Assertions auch ausgeschaltet werden und werden beim Ausführen des Programs entsprechend nicht berücksichtigt, eignen sich dadurch aber gerade deshalb zum Debuggen von unserem Quellcode.

Wie funktioniert diese Klausel?

Im Code schreiben wir assert(Behauptung);. Damit "versprechen" wir, dass unsere Behauptung immer wahr ist (Dafür muss diese Behauptung ein boolscher Ausdruck sein). Sollte sie das nicht sein, wird ein AssertionError ausgegeben. Ist unsere Behauptung wahr, passiert nichts.

Das Konstrukt sieht also in etwa aus wie ein if-Statement: Es gibt einen boolschen Ausdruck, der geprüft wird und entsprechend für wahr oder falsch ein bestimmtes Verhalten hervorruft. Allerdings ist das nur auf den ersten Blick wahr. if-Statements sollen niemals durch Assertions ersetzt werden.

Merkregeln zur Verwendung von Assertions:

Assertions ...

  1. ... sind kein Ersatz für if-Statements (Assertions können z.B. abgestellt werden)
  2. ... können global oder für einzelne Klassen ausgeliefert werden
  3. ... sollten eher für interne Fehler und Bugs verwendet werden
  4. ... sollten nicht in öffentlichen Methoden verwendet werden (Ausnahme hierbei sind "dead-code" Fälle z.B. bei switch-cases und Endlosschleifen)


Negativbeispiel

private List<String> memberNames = new ArrayList<>();

public void addMember(String name) {
    assert(name != null && !name.isBlank());
    memberNames.add(name);
}

Hier wird klar, dass Assertions durchaus in die Rolle eines if-Statements schlüpfen können. Allerdings wird ein bestimmtes Verhalten erzwungen, sollte das Versprechen nicht stimmen. Gegebenenfalls wollen wir keine Exception werfen. Zusätzlich kann es hier passieren, dass Assertions abgestellt werden und der Parameter daraufhin nicht mehr validiert wird. Es kann also zu Fehlern kommen.

Positivbeispiel

private List<String> memberNames = new ArrayList<>();
 
public void addMember(String name) {
    if (name == null || name.isBlank()) {
        throw new IllegalArgumentException("Invalid member name!");
    }
    memberNames.add(name);
}

Außer, dass der boolsche Ausdruck angepasst wurde, wurde nur die Assertion durch einen Äquivalenten if-Statement ersetzt, der es uns jetzt aber ermöglicht, in einem Fehlerfall anders zu reagieren. Zusätzlich ist es nicht möglich die Validierung des Parameters abzuschalten wie es bei Assertions möglich ist.


Wenn du diese Seite interessant fandest, findest du hier noch mehr Seite(n) dazu:
Exceptions