Šioje pamokoje su pavyzdžių pagalba sužinosime apie „Java“ teiginį („Java“ teiginius).
„Java“ teiginiai padeda aptikti klaidas, išbandydami kodą, kuris, mūsų manymu, yra teisingas.
Teiginys daromas naudojant assert
raktinį žodį.
Jo sintaksė yra:
assert condition;
Čia condition
yra loginė išraiška, kurią laikome tiesa, kai programa vykdoma.
Įgalinti teiginius
Pagal numatytuosius nustatymus teiginiai yra išjungiami ir vykdymo metu ignoruojami.
Norėdami įgalinti teiginius, mes naudojame:
java -ea:arguments
ARBA
java -enableassertions:arguments
Kai teiginiai yra įjungti ir sąlyga yra true
, programa vykdoma paprastai.
Bet jei sąlyga įvertinama, false
kol teiginiai yra įjungti, JVM išmeta AssertionError
ir programa tuoj pat sustoja.
1 pavyzdys: „Java“ teiginys
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"); ) )
Rezultatas
Yra 3 savaitgaliai per savaitę
Mes gauname pirmiau pateiktą išvestį, nes ši programa neturi kompiliavimo klaidų ir pagal numatytuosius nustatymus teiginiai yra išjungti.
Įgalinę teiginius, gauname tokį išėjimą:
Išimtis temoje „pagrindinis“ java.lang.AssertionError
Kita teiginio forma
assert condition : expression;
Šioje teiginio formoje išraiška perduodama AssertionError
objekto konstruktoriui . Ši išraiška turi vertę, kuri rodoma kaip išsamus klaidos pranešimas, jei sąlyga yra false
.
Išsamus pranešimas naudojamas tvirtinimo nesėkmės informacijai užfiksuoti ir perduoti, kad būtų lengviau išspręsti problemą.
2 pavyzdys: „Java“ teiginys su išraiškos pavyzdžiu
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"); ) )
Rezultatas
Išimtis temoje „main“ java.lang.AssertionError: Per savaitę yra tik 2 savaitgaliai
Kaip matome iš aukščiau pateikto pavyzdžio, išraiška perduodama AssertionError
objekto konstruktoriui . Jei mūsų prielaida yra false
ir teiginiai įgalinti, išimtis pateikiama su atitinkamu pranešimu.
Šis pranešimas padeda diagnozuoti ir ištaisyti klaidą, dėl kurios tvirtinimas nepavyko.
Įgalinti tvirtinimą konkrečioms klasėms ir paketams
Jei neteiksime jokių argumentų tvirtinimo komandinės eilutės jungikliams,
java -ea
Tai įgalina teiginius visose klasėse, išskyrus sistemos klases.
Taip pat galime įgalinti tvirtinimą konkrečioms klasėms ir paketams, naudodami argumentus. Argumentai, kuriuos galima pateikti šiems komandinės eilutės jungikliams, yra šie:
Įgalinti tvirtinimą klasės pavadinimuose
Norėdami įgalinti tvirtinimą visose mūsų programos „Main“ klasėse,
java -ea Main
Norėdami įgalinti tik vieną klasę,
java -ea:AnimalClass Main
Tai leidžia teiginį tik AnimalClass
į Main
programą.
Įgalinti tvirtinimą paketų pavadinimuose
Norėdami įgalinti teiginius tik paketui com.animal
ir jo paketams,
java -ea:com.animal… Main
Įgalinti tvirtinimą neįvardintose pakuotėse
Norėdami įgalinti tvirtinimą neįvardintuose paketuose (kai nenaudojame paketo sakinio) dabartiniame darbo kataloge.
java -ea:… Main
Įgalinti tvirtinimą sistemos klasėse
Norėdami įjungti tvirtinimą sistemos klasėse, mes naudojame kitą komandų eilutės jungiklį:
java -esa:arguments
ARBA
java -enablesystemassertions:arguments
Argumentai, kuriuos galima pateikti šiems jungikliams, yra vienodi.
Išjungti teiginius
Norėdami išjungti teiginius, mes naudojame:
java -da arguments
ARBA
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.
Jei teiginys yra įjungtas, programa veikia gerai. Tačiau jei teiginiai išjungti, sąrašo elementai nepašalinami. Tai gali sukelti programos gedimą.
Vietoj to priskirkite rezultatą kintamajam ir tada naudokite tą kintamąjį tvirtinimui.
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;
Tokiu būdu galime užtikrinti, kad visi savaitgaliai būtų pašalinti iš darbo dienų, neatsižvelgiant į tai, ar teiginys yra įjungtas ar išjungtas. Todėl tai neturi įtakos programos veikimui ateityje.