English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
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.
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
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.
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.
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.
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.
Schnelle und effiziente Fehlererkennung und -korrektur.
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.
Es hilft, Schablonenkode zu entfernen und den Code lesbarer zu machen.
Refactoring und Optimierung des Codes, um das Vertrauen in seine korrekte Ausführung zu stärken.
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.
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; ... }
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.
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.