Verwenden von Java-Zusicherungen

1. Einleitung

Mit dem Java- Assert- Schlüsselwort können Entwickler bestimmte Annahmen oder den Status eines Programms schnell überprüfen.

In diesem Artikel sehen wir uns an, wie das Java- Assert- Schlüsselwort verwendet wird.

2. Geschichte der Java-Zusicherungen

Das Java- Assert- Schlüsselwort wurde in Java 1.4 eingeführt, es gibt es also schon eine ganze Weile. Es bleibt jedoch ein wenig bekanntes Schlüsselwort, das die Boilerplate drastisch reduzieren und unseren Code lesbarer machen kann.

Beispielsweise müssen wir in unserem Code häufig bestimmte Bedingungen überprüfen, die möglicherweise die ordnungsgemäße Funktion unserer Anwendung beeinträchtigen. Normalerweise schreiben wir so etwas:

Connection conn = getConnection(); if(conn == null) { throw new RuntimeException("Connection is null"); }

Mit Assertions können wir die if- und throw- Anweisung mit einer einzigen assert- Anweisung entfernen .

3. Aktivieren von Java Assertions

Da Java-Zusicherungen das Schlüsselwort assert verwenden , werden keine Bibliotheken oder Pakete zum Importieren benötigt.

Beachten Sie, dass es vor Java 1.4 völlig legal war, das Wort "assert" zum Benennen von Variablen, Methoden usw. zu verwenden. Dies führt möglicherweise zu einem Namenskonflikt, wenn ein älterer Code mit neueren JVM-Versionen verwendet wird.

Aus Gründen der Abwärtskompatibilität deaktiviert die JVM daher standardmäßig die Validierung von Zusicherungen . Sie müssen explizit entweder mit dem Befehlszeilenargument -enableassertions oder mit der Kurzform -ea aktiviert werden:

java -ea com.baeldung.assertion.Assertion

In diesem Beispiel haben wir Zusicherungen für alle Klassen aktiviert.

Wir können auch Zusicherungen für bestimmte Pakete und Klassen aktivieren:

java -ea:com.baeldung.assertion... com.baeldung.assertion.Assertion

Hier haben wir Zusicherungen für alle Klassen im Paket com.baeldung.assertion aktiviert .

Ebenso können sie für bestimmte Pakete und Klassen mit dem Befehlszeilenargument -disableassertions oder der Kurzform -da deaktiviert werden . Wir können auch alle vier Argumente zusammen verwenden.

4. Verwenden von Java Assertions

Um Zusicherungen hinzuzufügen, verwenden Sie einfach das Schlüsselwort assert und geben Sie ihm eine boolesche Bedingung :

public void setup() { Connection conn = getConnection(); assert conn != null; }

Java bietet auch eine zweite Syntax für Zusicherungen, die eine Zeichenfolge benötigt, die zum Erstellen des AssertionError verwendet wird, wenn eine ausgelöst wird:

public void setup() { Connection conn = getConnection(); assert conn != null : "Connection is null"; }

In beiden Fällen überprüft der Code, ob eine Verbindung zu einer externen Ressource einen Wert ungleich Null zurückgibt. Wenn dieser Wert null ist, löst die JVM automatisch einen AssertionError aus .

Im zweiten Fall enthält die Ausnahme die zusätzlichen Details, die im Stack-Trace angezeigt werden und das Debuggen des Problems unterstützen können.

Schauen wir uns das Ergebnis der Ausführung unserer Klasse mit aktivierten Zusicherungen an:

Exception in thread "main" java.lang.AssertionError: Connection is null at com.baeldung.assertion.Assertion.setup(Assertion.java:15) at com.baeldung.assertion.Assertion.main(Assertion.java:10)

5. Behandlung eines AssertionError

Die Klasse AssertionError erweitert Error , die selbst Throwable erweitert . Dies bedeutet, dass AssertionError eine nicht aktivierte Ausnahme ist.

Daher müssen Methoden, die Zusicherungen verwenden, diese nicht deklarieren, und ein weiterer Aufruf von Code sollte nicht versuchen, sie abzufangen.

AssertionErrors sollen auf nicht behebbare Bedingungen in einer Anwendung hinweisen. Versuchen Sie daher niemals, diese zu behandeln oder eine Wiederherstellung zu versuchen.

6. Best Practices

Das Wichtigste, an das Sie sich bei Behauptungen erinnern sollten, ist, dass sie deaktiviert werden können. Gehen Sie also niemals davon aus, dass sie ausgeführt werden .

Beachten Sie daher bei der Verwendung von Behauptungen die folgenden Punkte:

  • Suchen Sie immer nach Nullwerten und leeren Sie gegebenenfalls Optionals
  • Vermeiden Sie die Verwendung von Zusicherungen zum Einchecken von Eingaben in eine öffentliche Methode und verwenden Sie stattdessen eine nicht aktivierte Ausnahme wie IllegalArgumentException oder NullPointerException
  • Rufen Sie keine Methoden unter Assertionsbedingungen auf und weisen Sie stattdessen das Ergebnis der Methode einer lokalen Variablen zu und verwenden Sie diese Variable mit Assert
  • Zusicherungen eignen sich hervorragend für Stellen im Code, die niemals ausgeführt werden, z. B. im Standardfall einer switch- Anweisung oder nach einer Schleife, die niemals beendet wird

7. Fazit

Das Java- Assert- Schlüsselwort ist seit vielen Jahren verfügbar, bleibt jedoch ein wenig bekanntes Merkmal der Sprache. Es kann dabei helfen, viel Code auf dem Boilerplate zu entfernen, den Code besser lesbar zu machen und Fehler frühzeitig in der Programmentwicklung zu erkennen.

Denken Sie daran, dass Zusicherungen nicht standardmäßig aktiviert sind. Gehen Sie also niemals davon aus, dass sie ausgeführt werden, wenn sie im Code verwendet werden.

Wie immer ist der vollständige Quellcode auf GitHub verfügbar.