HOWTO · Java

Das assert-Schlüsselwort in Java

In diesem Artikel wird beschrieben, wann und wie das Java-Schlüsselwort Assert verwendet wird.

Auf dieser Seite

Das Java-Schlüsselwort assert prüft eine Annahme des Programmierers; standardmäßig deaktiviert die JVM Assertions. Starten Sie das Programm mit -ea, um sie zu aktivieren. Ergibt die Bedingung einer aktivierten Assertion false, löst Java ein AssertionError aus; andernfalls wird die Ausführung fortgesetzt. Verwenden Sie Assertions für interne Annahmen, die während der Entwicklung gelten sollten, nicht für Verhalten, das die Anwendung bei jedem Lauf ausführen muss.

assert als boolesche Bedingung in Java verwenden

Die Grundform lautet assert condition;, wobei condition ein boolescher Ausdruck sein muss. Sind Assertions aktiviert und ist der Ausdruck false, löst Java an der Assertion-Anweisung ein AssertionError aus. Bei deaktivierten Assertions überspringt die JVM die Assertion einschließlich der Auswertung ihrer Bedingung. Deshalb darf die Bedingung keine Arbeit ausführen, von der das Programm abhängt.

Diese vollständige Klasse prüft eine Anzahl und gibt ein kurzes Ergebnis aus.

public class JavaAssertCheck {
  public static void main(String[] args) {
    String[] names = {"John", "Mary", "David"};
    assert names.length == 3;
    System.out.println("Name count: " + names.length);
  }
}

Kompilieren Sie die Klasse und führen Sie sie anschließend mit java -ea JavaAssertCheck aus, um die Prüfung zu aktivieren. Ohne -ea wird sie übersprungen. Wenn Sie die erwartete Anzahl in einen Wert ändern, der nicht mit der Länge des Arrays übereinstimmt, und Assertions aktivieren, wird das Programm bei der Assertion mit einem AssertionError beendet.

Eine Diagnosemeldung mit assert condition : expression hinzufügen

Verwenden Sie assert condition : expression, wenn ein Fehler zusätzliche Informationen enthalten soll. Der Ausdruck wird nur ausgewertet, wenn Assertions aktiviert sind und die Bedingung false ist; sein Wert wird zur Detailmeldung des ausgelösten AssertionError. Zum Beispiel nennt assert names.length == expected : "Expected " + expected + " names, got " + names.length; beide Anzahlen. Der Ausdruck sollte keine Seiteneffekte haben, denn bei erfüllter Bedingung und bei deaktivierten Assertions wird er nicht ausgewertet.

Mit assert auf einen unerwarteten Zweig hinweisen

Eine Assertion kann einen Laufzeit-Zweig markieren, der laut Programmlogik niemals erreicht werden sollte. Java weist eine Anweisung nach einem bedingungslos ausgeführten return zurück. Platzieren Sie die Assertion deshalb in einem Zweig, dessen Unerreichbarkeit der Compiler nicht beweisen kann:

public class StatusLabel {
  static String label(int status) {
    if (status == 0) {
      return "ready";
    } else if (status == 1) {
      return "busy";
    } else {
      assert false : "Unexpected status: " + status;
      return "unknown";
    }
  }

  public static void main(String[] args) {
    System.out.println(label(0));
  }
}

Sind Assertions aktiviert, löst das Erreichen des letzten Zweigs ein AssertionError aus, dessen Detail den Status enthält. Sind sie deaktiviert, wird stattdessen die Rückgabe im Ausweichzweig erreicht. Die Assertion dient daher der Diagnose und ist kein erforderlicher Bestandteil des Kontrollflusses.

Assertions sicher für interne Invarianten verwenden

Assertions eignen sich dazu, eine vom Programm selbst hergestellte Invariante zu dokumentieren, etwa dass ein Wert nach einer internen Berechnung innerhalb eines bestimmten Bereichs bleibt. Wird eine solche Annahme verletzt, lässt sich die Ursache während der Entwicklung damit leichter finden.

Verwenden Sie eine Assertion nicht, um Argumente zu prüfen, die an eine öffentliche Methode übergeben werden: Aufrufer benötigen unabhängig von den JVM-Optionen eine festgelegte Reaktion auf ungültige Eingaben. Führen Sie erforderliche Anwendungslogik ebenfalls nicht innerhalb einer Assertion aus, da deaktivierte Assertions ihre Bedingung überspringen. Vermeiden Sie aus demselben Grund Seiteneffekte in Assertion-Ausdrücken. Verwenden Sie normale Validierung und Kontrollfluss, wenn das Programm in der Produktion konsistent reagieren muss.