Java Assertions verwenden

Verwenden von Java-Zusicherungen

1. Einführung

Mit dem Schlüsselwort Javaassertkönnen Entwickler bestimmte Annahmen oder den Status eines Programms schnell überprüfen.

In diesem Artikel werdenwe’ll take a look at how to use the Java assert keyword.

2. Geschichte der Java-Behauptungen

Das Schlüsselwort von Javaassertwurde in Java 1.4 eingeführt, es gibt es also schon eine ganze Weile. Es ist jedoch nach wie vor ein wenig bekanntes Schlüsselwort, mit dem sich das Boilerplate drastisch reduzieren und der Code besser lesbar machen lässt.

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 Anweisungenif undthrow mit einer einzelnen Anweisungassert entfernen.

3. Aktivieren von Java-Zusicherungen

Da Java-Zusicherungen das Schlüsselwortassertverwenden, 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 gilt daherthe JVM disables assertion validation by default. Sie müssen explizit entweder mit dem Befehlszeilenargument-enableassertionsoder mit der Kurzform-ea: aktiviert werden

java -ea com.example.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.example.assertion... com.example.assertion.Assertion

Hier haben wir Zusicherungen für alle Klassen im Paketcom.example.assertionaktiviert.

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

4. Verwenden von Java-Zusicherungen

Um Zusicherungen hinzuzufügen,simply use the assert keyword and give it a boolean condition:

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 derAssertionError 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 Wertnull, ist, wird die JVMautomatically throw an AssertionError.

Im zweiten Fall enthält die Ausnahme die zusätzlichen Details, die im Stack-Trace angezeigt werden und beim Debuggen des Problems hilfreich sein 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.example.assertion.Assertion.setup(Assertion.java:15)
        at com.example.assertion.Assertion.main(Assertion.java:10)

5. Umgang mitAssertionError

Die KlasseAssertionError erweitertError, die selbstThrowable erweitert. Dies bedeutet, dassAssertionError eine ungeprüfte Ausnahme ist.

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

AssertionErrors are meant to indicate unrecoverable conditions in einer Anwendung, versuchen Sie also niemals, sie zu verarbeiten oder eine Wiederherstellung durchzuführen.

6. Empfohlene Vorgehensweise

Das Wichtigste, an das Sie sich bei Behauptungen erinnern sollten, ist, dass sie deaktiviert werden können, alsonever assume they’ll be executed.

Beachten Sie daher bei der Verwendung von Behauptungen Folgendes:

  • Suchen Sie immer nach Nullwerten und leeren Sie gegebenenfallsOptionals

  • Vermeiden Sie die Verwendung von Zusicherungen, um Eingaben in eine öffentliche Methode zu überprüfen, und verwenden Sie stattdessen eine aktivierte Ausnahme wieIllegalArgumentException oderNullPointerException

  • Rufen Sie keine Methoden unter Assertionsbedingungen auf und weisen Sie stattdessen das Ergebnis der Methode einer lokalen Variablen zu und verwenden Sie diese Variable mitassert

  • Zusicherungen eignen sich hervorragend für Stellen im Code, die niemals ausgeführt werden, z. B. der Falldefaulteinerswitch-Anweisung oder nach einer Schleife, die niemals beendet wird

7. Fazit

Das Schlüsselwort Javaassertist seit vielen Jahren verfügbar, bleibt jedoch ein wenig bekanntes Merkmal der Sprache. Es kann dabei helfen, viele Boilerplate-Codes zu entfernen, den Code besser lesbar zu machen und Fehler frühzeitig in der Programmentwicklung zu identifizieren.

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 Quellcodeover on GitHub verfügbar.