I denne opplæringen vil vi lære om Java-påstanden (Java-påstander) ved hjelp av eksempler.
Påstander i Java hjelper til med å oppdage feil ved å teste kode vi antar å være sanne.
En påstand gjøres ved hjelp av assert
nøkkelordet.
Dens syntaks er:
assert condition;
Her condition
er et boolsk uttrykk som vi antar er sant når programmet kjøres.
Aktivere påstander
Påstander er som standard deaktivert og ignorert ved kjøretid.
For å aktivere påstander bruker vi:
java -ea:arguments
ELLER
java -enableassertions:arguments
Når påstander er aktivert og tilstanden er true
, kjøres programmet normalt.
Men hvis tilstanden evalueres til false
mens påstander er aktivert, kaster JVM en AssertionError
, og programmet stopper umiddelbart.
Eksempel 1: Java-påstand
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"); ) )
Produksjon
Det er 3 helger i løpet av en uke
Vi får utdataene ovenfor fordi dette programmet ikke har noen kompileringsfeil, og påstander er som standard deaktivert.
Etter at påstander er aktivert, får vi følgende utdata:
Unntak i tråden "hoved" java.lang.AssertionError
En annen form for påstand
assert condition : expression;
I denne formen for påstandssetning sendes et uttrykk til konstruktøren av AssertionError
objektet. Dette uttrykket har en verdi som vises som feilmeldingens detaljmelding hvis tilstanden er false
.
Den detaljerte meldingen brukes til å fange opp og overføre informasjonen om påstanden om å ikke feilsøke problemet.
Eksempel 2: Java-påstand med uttrykkeksempel
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"); ) )
Produksjon
Unntak i tråden "hoved" java.lang.AssertionError: Det er bare to helger i løpet av en uke
Som vi ser fra eksemplet ovenfor, blir uttrykket overført til konstruktøren av AssertionError
objektet. Hvis vår antagelse er false
og påstander er aktivert, kastes et unntak med en passende melding.
Denne meldingen hjelper deg med å diagnostisere og fikse feilen som førte til at påstanden mislyktes.
Aktiverer påstand for spesifikke klasser og pakker
Hvis vi ikke gir noen argumenter for påstanden kommandolinjebrytere,
java -ea
Dette muliggjør påstander i alle klasser unntatt systemklasser.
Vi kan også aktivere påstand for spesifikke klasser og pakker ved hjelp av argumenter. Argumentene som kan gis til disse kommandolinjebryterne er:
Aktiver påstand i klassenavn
For å aktivere påstand for alle klasser i vårt hovedprogram,
java -ea Main
For å aktivere bare en klasse,
java -ea:AnimalClass Main
Dette gjør at påstanden i bare AnimalClass
i Main
programmet.
Aktiver påstand i pakkenavn
For å aktivere påstander for bare pakken com.animal
og dens underpakker,
java -ea:com.animal… Main
Aktiver påstand i ikke-navngitte pakker
For å aktivere påstand i ikke-navngitte pakker (når vi ikke bruker en pakkeerklæring) i gjeldende arbeidskatalog.
java -ea:… Main
Aktiver påstand i systemklasser
For å aktivere påstand i systemklasser bruker vi en annen kommandolinjebryter:
java -esa:arguments
ELLER
java -enablesystemassertions:arguments
Argumentene som kan gis til disse bryterne er de samme.
Deaktivering av påstander
For å deaktivere påstander bruker vi:
java -da arguments
ELLER
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.
Hvis påstanden er aktivert, fungerer programmet bra. Imidlertid, hvis påstander er deaktivert, fjernes ikke elementene fra listen. Dette kan føre til programfeil.
Tildel i stedet resultatet til en variabel, og bruk deretter den variabelen for påstand.
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å denne måten kan vi sikre at alle helgene blir fjernet fra ukedagene uavhengig av påstanden som er aktivert eller deaktivert. Som et resultat påvirker det ikke programdriften i fremtiden.