Selles õpetuses õpime näidete abil Java väidete väidet (Java väited).
Java väited aitavad vigu tuvastada, testides koodi, mille eeldame olevat tõene.
Väide tehakse assert
märksõna abil.
Selle süntaks on:
assert condition;
Siin condition
on tõeväärtuse väljend, mis eeldame, et see on tõsi, kui programm käivitatakse.
Kinnituste lubamine
Vaikimisi on väited käitamise ajal keelatud ja eiratud.
Väidete lubamiseks kasutame järgmist:
java -ea:arguments
VÕI
java -enableassertions:arguments
Kui väited on lubatud ja tingimus on true
, täidab programm tavapäraselt.
Kuid kui tingimuse väärtus on kinnitatud, false
kuni väited on lubatud, viskab JVM an AssertionError
ja programm peatub kohe.
Näide 1: Java väide
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"); ) )
Väljund
Nädalal on 3 nädalavahetust
Saame ülaltoodud väljundi, kuna sellel programmil pole kompileerimisvigu ja vaikimisi on väited keelatud.
Pärast väidete lubamist saame järgmise väljundi:
Erand lõimes "main" java.lang.AssertionError
Teine väite väide
assert condition : expression;
Selles väite vormis edastatakse avaldis AssertionError
objekti konstruktorile . Sellel avaldisel on väärtus, mis kuvatakse vea üksikasjaliku teatena, kui tingimus on false
.
Üksikasjalikku teadet kasutatakse väite ebaõnnestumise teabe hõivamiseks ja edastamiseks, et aidata probleemi silumisel.
Näide 2: Java väide koos näite näitega
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"); ) )
Väljund
Erand lõimes "main" java.lang.AssertionError: Nädalas on ainult 2 nädalavahetust
Nagu näeme ülaltoodud näitest, edastatakse avaldis AssertionError
objekti konstruktorile . Kui meie eeldus on false
ja väited on lubatud, lisatakse asjakohase sõnumiga erand.
See teade aitab väite nurjumise põhjustanud viga diagnoosida ja parandada.
Kinnituse lubamine konkreetsete klasside ja pakettide jaoks
Kui me ei esita väite käsurea lülititele argumente,
java -ea
See võimaldab väiteid kõikides klassides, välja arvatud süsteemiklassides.
Samuti võime argumentide abil lubada väite konkreetsetele klassidele ja pakettidele. Nendele käsurea lülititele saab anda järgmised argumendid:
Luba väide klassinimedes
Väite lubamiseks meie kõigi programmide Main klassides
java -ea Main
Ainult ühe klassi lubamiseks
java -ea:AnimalClass Main
See võimaldab väitele ainult AnimalClass
selles Main
programmis.
Lubage väide pakettide nimedes
Väidete lubamiseks ainult paketi com.animal
ja selle alampakettide jaoks
java -ea:com.animal… Main
Luba väide nimetu pakettides
Kinnituse lubamiseks nimetamata pakettides (kui me paketilauset ei kasuta) praeguses töökataloogis.
java -ea:… Main
Luba väide süsteemiklassides
Väite lubamiseks süsteemiklassides kasutame erinevat käsurea lülitit:
java -esa:arguments
VÕI
java -enablesystemassertions:arguments
Argumendid, mida neile lülititele saab anda, on samad.
Väidete keelamine
Väidete keelamiseks kasutame järgmist:
java -da arguments
VÕI
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.
Kui väide on lubatud, töötab programm hästi. Kui väited on keelatud, siis loendi elemente ei eemaldata. See võib põhjustada programmi tõrke.
Selle asemel määrake tulemus muutujale ja seejärel kasutage seda muutujat väitmiseks.
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;
Nii saame tagada, et kõik nädalavahetused eemaldatakse nädalapäevadest olenemata väite lubamisest või keelamisest. Seetõttu ei mõjuta see programmi toimimist tulevikus.