I den här handledningen lär vi oss om Java-påståendet (Java-påståenden) med hjälp av exempel.
Påståenden i Java hjälper till att upptäcka buggar genom att testa kod som vi antar är sant.
Ett påstående görs med hjälp av assert
nyckelordet.
Dess syntax är:
assert condition;
Här condition
är ett booleskt uttryck som vi antar är sant när programmet körs.
Aktivera påståenden
Påståenden är som standard inaktiverade och ignoreras vid körning.
För att aktivera påståenden använder vi:
java -ea:arguments
ELLER
java -enableassertions:arguments
När påståenden är aktiverade och villkoret är true
, körs programmet normalt.
Men om villkoret utvärderas till false
medan påståenden är aktiverade, kastar JVM ett AssertionError
, och programmet stannar omedelbart.
Exempel 1: Java-påstående
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"); ) )
Produktion
Det finns tre helger på en vecka
Vi får ovanstående utdata eftersom detta program inte har några kompileringsfel och som standard är påståenden inaktiverade.
Efter att ha aktiverat påståenden får vi följande utdata:
Undantag i tråden "main" java.lang.AssertionError
En annan form av påstående
assert condition : expression;
I denna form av påstående uttalande skickas ett uttryck till AssertionError
objektets konstruktör . Detta uttryck har ett värde som visas som felets detaljerade meddelande om villkoret är false
.
Det detaljerade meddelandet används för att fånga och överföra informationen om påståendefel för att hjälpa till att felsöka problemet.
Exempel 2: Java-påstående med uttrycksexempel
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"); ) )
Produktion
Undantag i tråden "main" java.lang.AssertionError: Det finns bara 2 helger på en vecka
Som vi ser från exemplet ovan överförs uttrycket till AssertionError
objektets konstruktör . Om vårt antagande är false
och påståenden är aktiverade kastas ett undantag med ett lämpligt meddelande.
Det här meddelandet hjälper till att diagnostisera och åtgärda felet som orsakade påståendet att misslyckas.
Aktiverar påstående för specifika klasser och paket
Om vi inte ger några argument till kommandoradsomkopplarna,
java -ea
Detta möjliggör påståenden i alla klasser utom systemklasser.
We can also enable assertion for specific classes and packages using arguments. The arguments that can be provided to these command-line switches are:
Enable assertion in class names
To enable assertion for all classes of our program Main,
java -ea Main
To enable only one class,
java -ea:AnimalClass Main
This enables assertion in only the AnimalClass
in the Main
program.
Enable assertion in package names
To enable assertions for package com.animal
and its sub-packages only,
java -ea:com.animal… Main
Enable assertion in unnamed packages
To enable assertion in unnamed packages (when we don’t use a package statement) in the current working directory.
java -ea:… Main
Enable assertion in system classes
To enable assertion in system classes, we use a different command-line switch:
java -esa:arguments
OR
java -enablesystemassertions:arguments
The arguments that can be provided to these switches are the same.
Disabling Assertions
To disable assertions, we use:
java -da arguments
OR
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.
Om påståendet är aktiverat fungerar programmet bra. Om påståenden är inaktiverade tas inte elementen från listan bort. Detta kan resultera i programfel.
Tilldela istället resultatet till en variabel och använd sedan variabeln för påståenden.
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;
På detta sätt kan vi se till att alla helger tas bort från vardagarna oavsett påståendet aktiverat eller inaktiverat. Som ett resultat påverkar det inte programmets funktion i framtiden.