English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java Grund教程

Java Flow Control

Java Array

Java objektorientiert (I)

Java objektorientiert (II)

Java objektorientiert (III)

Java Ausnahmen-Verarbeitung

Java Liste (List)

Java Queue (Warteschlange)

Java Map-Kollektion

Java Set-Kollektion

Java Eingabe/Ausgabe (I/O)

Java Reader/Writer

Andere Themen von Java

Java Behauptung (Assert)

In diesem Tutorial lernen wir durch Beispiele das Java-Assertion-Statement (Java-Assertion) kennen.

In Java helfen Assertionensprüche, indem sie Fehler in Code testen, den wir für korrekt halten, um Fehler zu erkennen.

Verwenden Sie den assert-Schlüsselwort zur Assertion.

Die Syntax ist:

assert condition;

Hier ist condition eine boolesche Ausdrucksbedingung, die wir annehmen, dass sie während der Ausführung des Programms wahr ist.

Assertionensprüche aktivieren

Standardmäßig sind Assertionensprüche bei der Ausführung deaktiviert und werden ignoriert.

Um Assertionensprüche zu aktivieren, verwenden wir:

java -ea:arguments

oder

java -enableassertions:arguments

Wenn Assertionensprüche aktiviert sind und die Bedingung true ist, wird das Programm normal ausgeführt.

Wenn die Bedingung bei der Aktivierung von Assertionensprüchen als false berechnet wird, wirft die JVM einen AssertionError aus und das Programm wird sofort beendet.

Beispiel1: Java Assertion

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length == 2;
    System.out.println("Diese Woche hat "); + weekends.length + "Weekenden");
  }
}

Ausgabeergebnis

Diese Woche hat 3 Weekenden

Wir erhalten die obige Ausgabe, weil das Programm keine Kompilationsfehler enthält und Assertionen standardmäßig deaktiviert sind.

Nach der Aktivierung der Assertionen erhalten wir folgende Ausgabe:

Exception in thread "main" java.lang.AssertionError

Eine andere Form der Assertionserklärung

assert condition : expression;

In diesem Form der Assertionssätze wird der Ausdruck dem Konstruktor des AssertionError-Objekts übergeben. Wenn die Bedingung falsch ist, wird der Wert des Ausdrucks als falsche Details angezeigt.

Detaillierte Nachrichten dienen zur Erfassung und Übertragung von Assertionsfailure-Informationen, um Probleme bei der Fehlersuche zu unterstützen.

Beispiel2: Beispiel mit Java-Assertionenausdrücken

class Main {
  public static void main(String args[]) {
    String[] weekends = {"Friday", "Saturday", "Sunday"};
    assert weekends.length==2 : "There are only 2 weekends in a week;
    System.out.println("There are "); + weekends.length + "	weekends in a week");
  }
}

Ausgabeergebnis

Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week

Aus dem obigen Beispiel geht hervor, dass der Ausdruck dem Konstruktor des AssertionError-Objekts übergeben wird. Wenn unser Annahme falsch ist und Assertionen aktiviert sind, wird eine Ausnahme ausgelöst und eine angemessene Nachricht angezeigt.

Diese Nachricht hilft bei der Diagnose und Reparatur von Fehlern, die zu einem Assertionsfailure führen.

Assertionen für spezifische Klassen und Pakete aktivieren

Wenn wir keine Parameter für die Assertion-Befehlszeilen-Schalter liefern

java -ea

Dies aktiviert Assertionen in allen Klassen außer den Systemklassen.

Wir können auch Assertionen für spezifische Klassen und Pakete aktivieren. Die Parameter, die diesen Befehlszeilen-Schaltern zur Verfügung stehen, sind:

Assertionen in Klassennamen aktivieren

Um Assertionen für alle Klassen im Programm Main zu aktivieren

java -ea Main

nur eine Klasse aktivieren

java -ea:AnimalClass Main

Dies erlaubt nur die Verwendung von Assertions in der AnimalClass des Main-Programms.

Aktivierung von Assertions im Paketnamen

Aktivierung von Assertions im Paket com.animal und seinen Unterpaketen

java -ea:com.animal... Main

Aktivierung von Assertions im unbenannten Paket

Aktivierung von Assertions im unbenannten Paket im aktuellen Arbeitsverzeichnis (wenn wir das Paket-Statement nicht verwenden).

java -ea:... Main

Aktivierung von Assertions in Systemklassen

Um Assertions in Systemklassen zu aktivieren, verwenden wir verschiedene Kommandozeilenschalter:

java -esa:arguments

oder

java -enablesystemassertions:arguments

Die übergebenen Parameter für diese Schalter sind gleich.

Deaktivierung von Assertions

Um Assertions zu deaktivieren, verwenden wir:

java -da arguments

oder

java -disableassertions arguments

Um Assertions in Systemklassen zu deaktivieren, verwenden wir:

java -dsa:arguments

oder

java -disablesystemassertions:arguments

Die übergebenen Parameter sind bei der Deaktivierung von Assertions gleich denen bei der Aktivierung.

Vorteile von Assertions

  1. Schnelle und effiziente Fehlererkennung und -korrektur.

  2. Assertions werden nur während der Entwicklung und des Tests überprüft. Sie werden automatisch aus Produktionscode entfernt, sodass die Ausführungszeit des Programms nicht verlangsamt wird.

  3. Es hilft, Schablonenkode zu entfernen und den Code lesbarer zu machen.

  4. Refactoring und Optimierung des Codes, um das Vertrauen in seine korrekte Ausführung zu stärken.

Wann sollte man Assertions verwenden?

1. Unreachable code

Unreachable code ist der Code, der nicht ausgeführt wird, wenn wir das Programm ausführen. Verwenden Sie Assertions, um sicherzustellen, dass der unreachable code tatsächlich unreachable ist.

Lassen Sie uns ein Beispiel nennen.

void unreachableCodeMethod() {
  System.out.println("Reachable code");
  return;
  // Unreachable code
  System.out.println("Unreachable code");
  assert false;
}

Lassen Sie uns einen Beispielcode für einen switch-Befehl ohne Default-Fall betrachten.

switch (dayOfWeek) {
  case "Sonntag":
    System.out.println("Es ist Sonntag!");
    break;
  case "Montag":
    System.out.println("Es ist Montag!");
    break;
  case "Dienstag":
    System.out.println("Es ist Dienstag!");
    break;
  case "Wednesday":
    System.out.println("Es ist Mittwoch!");
    break;
  case "Thursday":
    System.out.println("Es ist Donnerstag!");
    break;
  case "Friday":
    System.out.println("Es ist Freitag!");
    break;
  case "Saturday":
    System.out.println("Es ist Samstag!");
    break;
}

Die obige switch-Anweisung zeigt, dass die Tage der Woche nur die folgenden sein können7einer Wert. Keine Standardfall bedeutet, dass der Programmierer glaubt, dass einer dieser Fälle stets ausgeführt wird.

Aber in einigen Fällen, in denen bestimmte Annahmen tatsächlich falsch sind, wurden möglicherweise nicht alle Fälle in Betracht gezogen.

Behauptungen sollten verwendet werden, um diese Annahme zu überprüfen, um sicherzustellen, dass die Standardswitch-Bedingung nicht erreicht wird.

default:
    assert false: dayofWeek + " ist ein ungültiger Tag";

Wird der Wert von dayOfWeek nicht als gültiges Datum betrachtet, wird AssertionError ausgelöst.

2.Dokumentation der Annahmen

Um ihre grundlegenden Annahmen zu dokumentieren, verwenden viele Programmierer Kommentare. Lassen Sie uns ein Beispiel nennen.

if (i % 2 == 0) {
    ...
} else { // Wir wissen (i % 2 == 1)
    ...
}

Bitte verwenden Sie Behauptungen.

Mit dem Wachstum des Programms können Kommentare veraltet und不同步 sein. Aber wir müssen die Behauptungsanweisungen aktualisieren; andernfalls könnten sie auch aufgrund gültiger Bedingungen fehlschlagen.

if (i % 2 == 0) {
   ...
} else {
    assert i % 2 == 1 : i;
    ...
}

Wann sollten Behauptungen nicht verwendet werden

1.Überprüfung der Parameter in öffentlichen Methoden

Der Benutzer kann Parameter in öffentlichen Methoden bereitstellen.

Daher könnte die Bedingung, diese Parameter mit Behauptungen zu überprüfen, fehlschlagen und einen AssertionError verursachen.

Es ist besser, eine angemessene Laufzeit-Exception zu erzeugen und diese zu behandeln, anstatt Behauptungen zu verwenden.

2.Auflösung der Ausdrücke, die die Programmoperation beeinflussen

Rufen Sie keine Methoden auf oder bewerten Sie Ausnahmen, die unter Behauptungsbedingungen die Programmoperation beeinflussen könnten.

Lassen Sie uns mit einem Beispiel einer Liste weitermachen, die weekdays enthält, die Namen aller Tage der Woche.

ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"));
ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Sunday", "Saturday"));
assert weekdays.removeAll(weekends);

Hier versuchen wir, die Elemente Saturday und Sunday aus der ArrayList weekdays zu entfernen.

Wenn die Behauptung aktiviert ist, kann das Programm normal funktionieren. Aber wenn die Behauptung deaktiviert ist, werden die Elemente in der Liste nicht gelöscht. Dies könnte dazu führen, dass das Programm fehlschlägt.

Anstatt das Ergebnis der Variable zuzuweisen und dann die Variable zu verwenden, um eine Assertion auszuführen.

ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"));
ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Sunday", "Saturday"));
boolean weekendsRemoved = weekdays.removeAll(weekends);
assert weekendsRemoved;

So können wir sicherstellen, dass alle weekends aus weekdays entfernt werden, ohne dass es darauf ankommt, ob Assertions aktiviert oder deaktiviert sind. Infolgedessen beeinflusst es nicht zukünftige Programmoperationen.