In diesem Tutorial lernen wir anhand von Beispielen die Java-Assert-Anweisung (Java-Assertions) kennen.
Behauptungen in Java helfen dabei, Fehler zu erkennen, indem Code getestet wird, von dem wir annehmen, dass er wahr ist.
Eine Aussage wird mit dem assert
Schlüsselwort gemacht.
Die Syntax lautet:
assert condition;
Hier condition
ist ein boolescher Ausdruck, von dem wir annehmen, dass er wahr ist, wenn das Programm ausgeführt wird.
Aktivieren von Zusicherungen
Standardmäßig werden Zusicherungen zur Laufzeit deaktiviert und ignoriert.
Um Aussagen zu ermöglichen, verwenden wir:
java -ea:arguments
ODER
java -enableassertions:arguments
Wenn Zusicherungen aktiviert sind und die Bedingung lautet true
, wird das Programm normal ausgeführt.
Wenn die Bedingung jedoch ausgewertet wird, false
während Zusicherungen aktiviert sind, löst JVM eine aus AssertionError
und das Programm stoppt sofort.
Beispiel 1: Java-Zusicherung
class Main ( public static void main(String args()) ( String() weekends = ("Friday", "Saturday", "Sunday"); assert weekends.length == 2; System.out.println("There are " + weekends.length + " weekends in a week"); ) )
Ausgabe
Es gibt 3 Wochenenden in einer Woche
Wir erhalten die obige Ausgabe, da dieses Programm keine Kompilierungsfehler aufweist und Zusicherungen standardmäßig deaktiviert sind.
Nach dem Aktivieren von Assertions erhalten wir die folgende Ausgabe:
Ausnahme im Thread "main" java.lang.AssertionError
Eine andere Form der Behauptung
assert condition : expression;
In dieser Form der Assertionsanweisung wird ein Ausdruck an den Konstruktor des AssertionError
Objekts übergeben. Dieser Ausdruck hat einen Wert, der als Fehlermeldung des Fehlers angezeigt wird, wenn die Bedingung erfüllt ist false
.
Die detaillierte Nachricht wird verwendet, um die Informationen des Assertionsfehlers zu erfassen und zu übertragen, um das Problem zu beheben.
Beispiel 2: Java-Zusicherung mit Ausdrucksbeispiel
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"); ) )
Ausgabe
Ausnahme im Thread "main" java.lang.AssertionError: Es gibt nur 2 Wochenenden in einer Woche
Wie aus dem obigen Beispiel hervorgeht, wird der Ausdruck an den Konstruktor des AssertionError
Objekts übergeben. Wenn unsere Annahme lautet false
und Zusicherungen aktiviert sind, wird eine Ausnahme mit einer entsprechenden Nachricht ausgelöst.
Diese Meldung hilft bei der Diagnose und Behebung des Fehlers, der zum Fehlschlagen der Bestätigung geführt hat.
Aktivieren der Zusicherung für bestimmte Klassen und Pakete
Wenn wir keine Argumente für die Assertion-Befehlszeilenoptionen angeben,
Java -ea
Dies ermöglicht Zusicherungen in allen Klassen außer Systemklassen.
Wir können die Zusicherung auch für bestimmte Klassen und Pakete mithilfe von Argumenten aktivieren. Die Argumente, die für diese Befehlszeilenoptionen bereitgestellt werden können, sind:
Aktivieren Sie die Zusicherung in Klassennamen
Um die Bestätigung für alle Klassen unseres Programms Main zu ermöglichen,
java -ea Main
Um nur eine Klasse zu aktivieren,
java -ea:AnimalClass Main
Dies ermöglicht die Zusicherung nur AnimalClass
im Main
Programm.
Aktivieren Sie die Zusicherung in Paketnamen
Um Zusicherungen nur für das Paket com.animal
und seine Unterpakete zu aktivieren ,
java -ea:com.animal… Main
Aktivieren Sie die Zusicherung in unbenannten Paketen
Aktivieren der Zusicherung in unbenannten Paketen (wenn keine Paketanweisung verwendet wird) im aktuellen Arbeitsverzeichnis.
java -ea:… Main
Aktivieren Sie die Zusicherung in Systemklassen
Um die Zusicherung in Systemklassen zu aktivieren, verwenden wir einen anderen Befehlszeilenschalter:
java -esa:arguments
ODER
java -enablesystemassertions:arguments
Die Argumente, die für diese Switches bereitgestellt werden können, sind dieselben.
Deaktivieren von Zusicherungen
Um Behauptungen zu deaktivieren, verwenden wir:
java -da arguments
ODER
java -disableassertions arguments
To disable assertion in system classes, we use:
java -dsa:arguments
OR
java -disablesystemassertions:arguments
The arguments that can be passed while disabling assertions are the same as while enabling them.
Advantages of Assertion
- Quick and efficient for detecting and correcting bugs.
- Assertion checks are done only during development and testing. They are automatically removed in the production code at runtime so that it won’t slow the execution of the program.
- It helps remove boilerplate code and make code more readable.
- Refactors and optimizes code with increased confidence that it functions correctly.
When to use Assertions
1. Unreachable codes
Unreachable codes are codes that do not execute when we try to run the program. Use assertions to make sure unreachable codes are actually unreachable.
Let’s take an example.
void unreachableCodeMethod() ( System.out.println("Reachable code"); return; // Unreachable code System.out.println("Unreachable code"); assert false; )
Let’s take another example of a switch statement without a default case.
switch (dayOfWeek) ( case "Sunday": System.out.println("It’s Sunday!"); break; case "Monday": System.out.println("It’s Monday!"); break; case "Tuesday": System.out.println("It’s Tuesday!"); break; case "Wednesday": System.out.println("It’s Wednesday!"); break; case "Thursday": System.out.println("It’s Thursday!"); break; case "Friday": System.out.println("It’s Friday!"); break; case "Saturday": System.out.println("It’s Saturday!"); break; )
The above switch statement indicates that the days of the week can be only one of the above 7 values. Having no default case means that the programmer believes that one of these cases will always be executed.
However, there might be some cases that have not yet been considered where the assumption is actually false.
This assumption should be checked using an assertion to make sure that the default switch case is not reached.
default: assert false: dayofWeek + " is invalid day";
If dayOfWeek has a value other than the valid days, an AssertionError
is thrown.
2. Documenting assumptions
To document their underlying assumptions, many programmers use comments. Let’s take an example.
if (i % 2 == 0) (… ) else ( // We know (i % 2 == 1)… )
Use assertions instead.
Comments can get out-of-date and out-of-sync as the program grows. However, we will be forced to update the assert
statements; otherwise, they might fail for valid conditions too.
if (i % 2 == 0) (… ) else ( assert i % 2 == 1 : i;… )
When not to use Assertions
1. Argument checking in public methods
Arguments in public methods may be provided by the user.
So, if an assertion is used to check these arguments, the conditions may fail and result in AssertionError
.
Instead of using assertions, let it result in the appropriate runtime exceptions and handle these exceptions.
2. To evaluate expressions that affect the program operation
Do not call methods or evaluate exceptions that can later affect the program operation in assertion conditions.
Let us take an example of a list weekdays which contains the names of all the days in a week.
ArrayList weekdays = new ArrayList(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList weekends= new ArrayList(Arrays.asList("Sunday", "Saturday" )); assert weekdays.removeAll(weekends);
Here, we are trying to remove elements Saturday
and Sunday
from the ArrayList weekdays.
Wenn die Zusicherung aktiviert ist, funktioniert das Programm einwandfrei. Wenn Zusicherungen jedoch deaktiviert sind, werden die Elemente aus der Liste nicht entfernt. Dies kann zu einem Programmfehler führen.
Weisen Sie das Ergebnis stattdessen einer Variablen zu und verwenden Sie diese Variable zur Bestätigung.
ArrayList weekdays = new ArrayList(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" )); ArrayList weekends= new ArrayList(Arrays.asList("Sunday", "Saturday" )); boolean weekendsRemoved = weekdays.removeAll(weekends); assert weekendsRemoved;
Auf diese Weise können wir sicherstellen, dass alle Wochenenden von den Wochentagen entfernt werden, unabhängig davon, ob die Zusicherung aktiviert oder deaktiviert ist. Infolgedessen hat dies in Zukunft keine Auswirkungen auf den Programmbetrieb.