În acest tutorial, vom afla despre afirmația Java (Java asertions) cu ajutorul exemplelor.
Afirmațiile din Java ajută la detectarea erorilor testând codul pe care îl presupunem a fi adevărat.
O afirmație este făcută folosind assert
cuvântul cheie.
Sintaxa sa este:
assert condition;
Iată condition
o expresie booleană pe care o presupunem că este adevărată atunci când programul se execută.
Activarea afirmațiilor
În mod implicit, afirmațiile sunt dezactivate și ignorate în timpul rulării.
Pentru a activa afirmații, folosim:
java -ea:arguments
SAU
java -enableassertions:arguments
Când afirmațiile sunt activate și condiția este true
, programul se execută normal.
Dar dacă condiția se evaluează până false
când afirmațiile sunt activate, JVM aruncă un AssertionError
, iar programul se oprește imediat.
Exemplul 1: afirmație 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"); ) )
Ieșire
Există 3 weekenduri într-o săptămână
Obținem rezultatul de mai sus, deoarece acest program nu are erori de compilare și, în mod implicit, afirmațiile sunt dezactivate.
După activarea afirmațiilor, obținem următorul rezultat:
Excepție în firul „principal” java.lang.AssertionError
O altă formă de afirmație
assert condition : expression;
În această formă de afirmație, o expresie este transmisă constructorului AssertionError
obiectului. Această expresie are o valoare care este afișată ca mesaj de detaliu al erorii dacă condiția este false
.
Mesajul detaliat este utilizat pentru a capta și transmite informațiile despre eșecul afirmației pentru a ajuta la depanarea problemei.
Exemplul 2: afirmație Java cu exemplu de expresie
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"); ) )
Ieșire
Excepție în firul „principal” java.lang.AssertionError: Există doar 2 weekenduri într-o săptămână
După cum vedem din exemplul de mai sus, expresia este transmisă constructorului AssertionError
obiectului. Dacă presupunerea noastră este false
și afirmațiile sunt activate, o excepție este aruncată cu un mesaj adecvat.
Acest mesaj ajută la diagnosticarea și remedierea erorii care a cauzat eșecul afirmației.
Activarea afirmării pentru anumite clase și pachete
Dacă nu oferim niciun argument comutatoarelor de linie de comandă de afirmare,
java -ea
Aceasta permite afirmații în toate clasele, cu excepția claselor de sistem.
De asemenea, putem activa afirmarea pentru anumite clase și pachete folosind argumente. Argumentele care pot fi furnizate acestor comutatoare de linie de comandă sunt:
Activați afirmarea în numele clasei
Pentru a permite afirmarea pentru toate clasele programului nostru Principal,
java -ea Main
Pentru a activa o singură clasă,
java -ea:AnimalClass Main
Acest lucru permite afirmarea doar AnimalClass
în Main
program.
Activați afirmarea în numele pachetelor
Pentru a activa afirmații numai pentru pachet com.animal
și subpachetele sale,
java -ea:com.animal… Main
Activați afirmarea în pachetele fără nume
Pentru a activa afirmarea în pachete fără nume (atunci când nu folosim o instrucțiune de pachet) în directorul de lucru curent.
java -ea:… Main
Activați afirmarea în clasele de sistem
Pentru a activa afirmarea în clasele de sistem, folosim un comutator de linie de comandă diferit:
java -esa:arguments
SAU
java -enablesystemassertions:arguments
Argumentele care pot fi furnizate acestor comutatoare sunt aceleași.
Dezactivarea afirmațiilor
Pentru a dezactiva afirmațiile, folosim:
java -da arguments
SAU
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.
Dacă afirmația este activată, programul funcționează bine. Cu toate acestea, dacă afirmațiile sunt dezactivate, elementele din listă nu sunt eliminate. Acest lucru poate duce la eșecul programului.
În schimb, atribuiți rezultatul unei variabile și apoi utilizați acea variabilă pentru afirmare.
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;
În acest fel, ne putem asigura că toate weekend-urile sunt eliminate din zilele lucrătoare, indiferent dacă afirmația este activată sau dezactivată. Ca urmare, nu afectează funcționarea programului în viitor.