Java Assertions (assert Statement)

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 assertSchlüsselwort gemacht.

Die Syntax lautet:

 assert condition;

Hier conditionist 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, falsewährend Zusicherungen aktiviert sind, löst JVM eine aus AssertionErrorund 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 AssertionErrorObjekts ü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 AssertionErrorObjekts übergeben. Wenn unsere Annahme lautet falseund 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 AnimalClassim MainProgramm.

Aktivieren Sie die Zusicherung in Paketnamen

Um Zusicherungen nur für das Paket com.animalund 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

  1. Quick and efficient for detecting and correcting bugs.
  2. 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.
  3. It helps remove boilerplate code and make code more readable.
  4. 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.

Interessante Beiträge...