Java-beweringen (verklaring beweren)

In deze tutorial leren we aan de hand van voorbeelden over de Java assert-instructie (Java-assertions).

Beweringen in Java helpen bugs te detecteren door code te testen waarvan we aannemen dat deze waar is.

Een bewering wordt gedaan met behulp van het asserttrefwoord.

De syntaxis is:

 assert condition;

Hier conditionis een booleaanse uitdrukking waarvan we aannemen dat deze waar is wanneer het programma wordt uitgevoerd.

Beweringen mogelijk maken

Standaard zijn beweringen uitgeschakeld en genegeerd tijdens runtime.

Om beweringen mogelijk te maken, gebruiken we:

 java -ea:arguments

OF

 java -enableassertions:arguments

Als beweringen zijn ingeschakeld en de voorwaarde is true, wordt het programma normaal uitgevoerd.

Maar als de voorwaarde evalueert falseterwijl beweringen zijn ingeschakeld, gooit JVM een AssertionErroren stopt het programma onmiddellijk.

Voorbeeld 1: Java-bewering

 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"); ) ) 

Uitvoer

 Er zijn 3 weekenden in een week 

We krijgen de bovenstaande uitvoer omdat dit programma geen compilatiefouten heeft en standaard zijn beweringen uitgeschakeld.

Nadat we beweringen hebben ingeschakeld, krijgen we de volgende uitvoer:

 Uitzondering in thread "main" java.lang.AssertionError 

Een andere vorm van bewering

 assert condition : expression; 

In deze vorm van een assertion statement wordt een expressie doorgegeven aan de constructor van het AssertionErrorobject. Deze expressie heeft een waarde die wordt weergegeven als het detailbericht van de fout als de voorwaarde dat is false.

Het gedetailleerde bericht wordt gebruikt om de informatie over het mislukken van de bewering vast te leggen en te verzenden om te helpen bij het oplossen van het probleem.

Voorbeeld 2: Java-bewering met expressievoorbeeld

 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"); ) ) 

Uitvoer

 Uitzondering in thread "main" java.lang.AssertionError: Er zijn slechts 2 weekenden in een week 

Zoals we in het bovenstaande voorbeeld zien, wordt de uitdrukking doorgegeven aan de constructor van het AssertionErrorobject. Als onze aanname is falseen beweringen zijn ingeschakeld, wordt een uitzondering gegenereerd met een passend bericht.

Dit bericht helpt bij het diagnosticeren en verhelpen van de fout waardoor de bewering is mislukt.

Bevestiging inschakelen voor specifieke klassen en pakketten

Als we geen argumenten geven voor de opdrachtregelopties voor assertion,

 java -ea 

Dit maakt beweringen mogelijk in alle klassen behalve systeemklassen.

We kunnen ook assertion inschakelen voor specifieke klassen en pakketten met behulp van argumenten. De argumenten die aan deze opdrachtregelopties kunnen worden verstrekt, zijn:

Schakel bevestiging in klassenamen in

Om bewering mogelijk te maken voor alle klassen van ons programma Main,

 java -ea Main

Om slechts één klas in te schakelen,

 java -ea:AnimalClass Main

Dit maakt bewering mogelijk in alleen de AnimalClassin het Mainprogramma.

Schakel bevestiging in pakketnamen in

Om beweringen alleen voor het pakket com.animalen zijn subpakketten mogelijk te maken,

 java -ea:com.animal… Main

Activeer bewering in pakketten zonder naam

Om bewering in naamloze pakketten mogelijk te maken (als we geen pakketinstructie gebruiken) in de huidige werkdirectory.

 java -ea:… Main

Schakel bewering in systeemklassen in

Om bewering in systeemklassen mogelijk te maken, gebruiken we een andere opdrachtregeloptie:

 java -esa:arguments 

OF

 java -enablesystemassertions:arguments

De argumenten die aan deze schakelaars kunnen worden verstrekt, zijn dezelfde.

Beweringen uitschakelen

Om beweringen uit te schakelen, gebruiken we:

 java -da arguments 

OF

 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.

Als de bewering is ingeschakeld, werkt het programma prima. Als beweringen echter zijn uitgeschakeld, worden de elementen uit de lijst niet verwijderd. Dit kan leiden tot een programmafout.

Wijs in plaats daarvan het resultaat toe aan een variabele en gebruik die variabele vervolgens voor bevestiging.

 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; 

Op deze manier kunnen we ervoor zorgen dat alle weekenden uit de weekdagen worden verwijderd, ongeacht of de bewering is in- of uitgeschakeld. Als gevolg hiervan heeft het geen invloed op de werking van het programma in de toekomst.

Interessante artikelen...