V tej vadnici bomo s pomočjo primerov spoznali izjavo o uveljavljanju Java (trditve Java).
Trditve v Javi pomagajo odkriti napake s testiranjem kode, za katero domnevamo, da je resnična.
Trditev je podana s assert
ključno besedo.
Njegova sintaksa je:
assert condition;
Tu condition
je logični izraz, za katerega predpostavljamo, da je resničen, ko se program zažene.
Omogočanje trditev
Privzeto so trditve med izvajanjem onemogočene in prezrte.
Za omogočanje trditev uporabljamo:
java -ea:arguments
ALI
java -enableassertions:arguments
Ko so trditve omogočene in je pogoj true
, se program izvaja normalno.
Če pa stanje oceni, false
ko so trditve omogočene, JVM vrne AssertionError
in program se takoj ustavi.
Primer 1: trditev Java
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"); ) )
Izhod
V tednu so 3 vikendi
Zgornji izhod dobimo, ker ta program nima napak pri prevajanju in so privzeto trditve onemogočene.
Po omogočanju trditev dobimo naslednji izhod:
Izjema v niti "main" java.lang.AssertionError
Druga oblika trditve
assert condition : expression;
V tej obliki izjave o trditvi se izraz posreduje konstruktorju AssertionError
predmeta. Ta izraz ima vrednost, ki je prikazana kot podrobno sporočilo o napaki, če je pogoj false
.
Podrobno sporočilo se uporablja za zajem in posredovanje informacij o napaki trditve za pomoč pri odpravljanju težave.
Primer 2: Trditev Java s primerom izraza
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"); ) )
Izhod
Izjema v niti "main" java.lang.AssertionError: V tednu sta le 2 vikenda
Kot vidimo iz zgornjega primera, se izraz posreduje konstruktorju AssertionError
predmeta. Če je naša predpostavka false
in trditve omogočene, se vrne izjema z ustreznim sporočilom.
To sporočilo pomaga pri diagnosticiranju in odpravljanju napake, zaradi katere trditev ni uspela.
Omogočanje uveljavljanja za določene razrede in pakete
Če stikalom ukazne vrstice trditve ne podajamo nobenih argumentov,
java -ea
To omogoča trditve v vseh razredih, razen v sistemskih.
Z argumenti lahko omogočimo tudi uveljavljanje za določene razrede in pakete. Argumenti, ki jih je mogoče zagotoviti tem stikalom ukazne vrstice, so:
Omogoči uveljavljanje v imenih razredov
Če želite omogočiti trditev za vse razrede našega programa Main,
java -ea Main
Če želite omogočiti samo en razred,
java -ea:AnimalClass Main
To omogoča uveljavitev samo AnimalClass
v Main
programu.
Omogoči uveljavljanje v imenih paketov
Če želite omogočiti trditve samo za paket com.animal
in njegove podpakete,
java -ea:com.animal… Main
Omogoči uveljavljanje v neimenovanih paketih
Omogočiti uveljavljanje v neimenovanih paketih (kadar ne uporabljamo stavka o paketu) v trenutnem delovnem imeniku.
java -ea:… Main
Omogoči uveljavljanje v sistemskih razredih
Da omogočimo uveljavljanje v sistemskih razredih, uporabimo drugo stikalo ukazne vrstice:
java -esa:arguments
ALI
java -enablesystemassertions:arguments
Argumenti, ki jih je mogoče dati tem stikalom, so enaki.
Onemogočanje trditev
Če želimo onemogočiti trditve, uporabimo:
java -da arguments
ALI
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.
Če je trditev omogočena, program deluje v redu. Če pa so trditve onemogočene, elementi s seznama ne bodo odstranjeni. To lahko privede do okvare programa.
Namesto tega rezultat dodelite spremenljivki in jo nato uporabite za trditev.
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;
Na ta način lahko zagotovimo, da so vsi vikendi odstranjeni iz delavnikov, ne glede na to, ali je trditev omogočena ali onemogočena. Posledično to ne vpliva na delovanje programa v prihodnosti.