U ovom ćemo uputstvu uz primjere naučiti o izjavi za Javinu tvrdnju (Java tvrdnje).
Tvrdnje u Javi pomažu u otkrivanju pogrešaka testiranjem koda za koji pretpostavljamo da je istinit.
Tvrdnja se iznosi pomoću assert
ključne riječi.
Njegova sintaksa je:
assert condition;
Ovdje condition
je logički izraz za koji pretpostavljamo da je istinit kada se program izvršava.
Omogućavanje tvrdnji
Prema zadanim postavkama, tvrdnje su onemogućene i ignorirane tijekom izvođenja.
Da bismo omogućili tvrdnje, koristimo:
java -ea:arguments
ILI
java -enableassertions:arguments
Kad su tvrdnje omogućene i uvjet je true
, program se izvršava normalno.
Ali ako uvjet procijeni da su false
dok su tvrdnje omogućene, JVM baca znak AssertionError
i program se odmah zaustavlja.
Primjer 1: Javna tvrdnja
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"); ) )
Izlaz
U tjednu su 3 vikenda
Dobivamo gornji izlaz jer ovaj program nema pogrešaka u kompilaciji i prema zadanim postavkama tvrdnje su onemogućene.
Nakon omogućavanja tvrdnji, dobivamo sljedeći izlaz:
Iznimka u niti "main" java.lang.AssertionError
Drugi oblik izjave o tvrdnji
assert condition : expression;
U ovom obliku izjave o tvrdnji, izraz se prenosi konstruktoru AssertionError
objekta. Ovaj izraz ima vrijednost koja se prikazuje kao poruka s detaljima pogreške ako je uvjet false
.
Detaljna poruka koristi se za hvatanje i prijenos informacija o neuspjehu tvrdnje kako bi se pomoglo u rješavanju problema.
Primjer 2: Javna tvrdnja s primjerom 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"); ) )
Izlaz
Iznimka u niti "main" java.lang.AssertionError: Postoje samo 2 vikenda u tjednu
Kao što vidimo iz gornjeg primjera, izraz se prenosi konstruktoru AssertionError
objekta. Ako je naša pretpostavka false
i tvrdnje omogućene, izuzetak se šalje s odgovarajućom porukom.
Ova poruka pomaže u dijagnosticiranju i ispravljanju pogreške zbog koje je tvrdnja propala.
Omogućavanje tvrdnji za određene klase i pakete
Ako ne pružimo nikakve argumente prekidačima naredbenog retka za tvrdnju,
java -ea
To omogućuje tvrdnje u svim klasama, osim u sistemskim klasama.
Također možemo omogućiti tvrdnju za određene klase i pakete koristeći argumente. Argumenti koji se mogu pružiti ovim prekidačima naredbenog retka su:
Omogućiti tvrdnju u imenima klasa
Da bismo omogućili tvrdnju za sve razrede našeg programa Main,
java -ea Main
Da biste omogućili samo jedan razred,
java -ea:AnimalClass Main
To omogućuje tvrdnju samo AnimalClass
u Main
programu.
Omogućite tvrdnju u imenima paketa
Da biste omogućili tvrdnje samo za paket com.animal
i njegove podpakete,
java -ea:com.animal… Main
Omogućite tvrdnju u neimenovanim paketima
Omogućiti tvrdnju u neimenovanim paketima (kada ne koristimo izjavu o paketu) u trenutnom radnom direktoriju.
java -ea:… Main
Omogućiti tvrdnju u sistemskim klasama
Da bismo omogućili tvrdnju u sistemskim klasama, koristimo drugu sklopku naredbenog retka:
java -esa:arguments
ILI
java -enablesystemassertions:arguments
Argumenti koji se mogu pružiti ovim prekidačima su isti.
Onemogućavanje tvrdnji
Da bismo onemogućili tvrdnje, koristimo:
java -da arguments
ILI
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.
Ako je tvrdnja omogućena, program radi u redu. Međutim, ako su tvrdnje onemogućene, elementi s popisa neće se ukloniti. To može rezultirati neuspjehom programa.
Umjesto toga, dodijelite rezultat varijabli, a zatim je upotrijebite za tvrdnju.
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 taj način možemo osigurati uklanjanje svih vikenda iz radnih dana, bez obzira na to je li tvrdnja omogućena ili onemogućena. Kao rezultat, to ne utječe na rad programa u budućnosti.