Šajā apmācībā mēs uzzināsim par Java apgalvojuma paziņojumu (Java apgalvojumi), izmantojot piemērus.
Java apgalvojumi palīdz atklāt kļūdas, pārbaudot kodu, kuru pieņemam par patiesu.
Apgalvojums tiek veikts, izmantojot assert
atslēgvārdu.
Tās sintakse ir:
assert condition;
Šeit condition
ir būla izteiksme, kuru mēs pieņemam par patiesu, kad programma tiek izpildīta.
Iespējojot apgalvojumus
Pēc noklusējuma apgalvojumi tiek atspējoti un izpildes laikā tiek ignorēti.
Lai iespējotu apgalvojumus, mēs izmantojam:
java -ea:arguments
VAI
java -enableassertions:arguments
Kad apgalvojumi ir iespējoti un nosacījums ir true
, programma darbojas normāli.
Bet, ja nosacījums tiek novērtēts līdz false
brīdim, kad apgalvojumi ir iespējoti, JVM iemet a AssertionError
, un programma nekavējoties apstājas.
1. piemērs: Java apgalvojums
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"); ) )
Rezultāts
Nedēļas laikā ir 3 nedēļas nogales
Mēs iegūstam iepriekš minēto izvadi, jo šai programmai nav kompilācijas kļūdu, un pēc noklusējuma apgalvojumi ir atspējoti.
Pēc apgalvojumu iespējošanas mēs iegūstam šādu rezultātu:
Izņēmums pavedienā "main" java.lang.AssertionError
Vēl viena apgalvojuma forma
assert condition : expression;
Šajā apgalvojuma apgalvojuma izteiksme tiek nodota AssertionError
objekta konstruktoram . Šai izteiksmei ir vērtība, kas tiek parādīta kā kļūdas detalizēts ziņojums, ja nosacījums ir false
.
Detalizēts ziņojums tiek izmantots, lai iegūtu un pārsūtītu informāciju par apgalvojuma neveiksmi, lai palīdzētu atkļūdot problēmu.
2. piemērs: Java apgalvojums ar izteiksmes piemēru
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"); ) )
Rezultāts
Izņēmums pavedienā "main" java.lang.AssertionError: Nedēļā ir tikai 2 nedēļas nogales
Kā redzam no iepriekš minētā piemēra, izteiksme tiek nodota AssertionError
objekta konstruktoram . Ja mūsu pieņēmums ir false
un apgalvojumi ir iespējoti, ar atbilstošu ziņojumu tiek izmests izņēmums.
Šis ziņojums palīdz diagnosticēt un novērst kļūdu, kuras dēļ apgalvojums neizdevās.
Iespējojot apgalvojumu noteiktām klasēm un paketēm
Ja mēs nesniedzam argumentus apgalvojuma komandrindas slēdžiem,
java -ea
Tas ļauj apgalvojumus visās klasēs, izņemot sistēmu klases.
Mēs varam arī iespējot apgalvojumu noteiktām klasēm un paketēm, izmantojot argumentus. Argumenti, kurus var sniegt šiem komandrindas slēdžiem, ir šādi:
Iespējot apgalvojumu klases nosaukumos
Lai iespējotu apgalvojumu visām mūsu programmas Main klasēm,
java -ea Main
Lai iespējotu tikai vienu klasi,
java -ea:AnimalClass Main
Tas ļauj apgalvojumus tikai AnimalClass
šajā Main
programmā.
Iespējot apgalvojumu pakotņu nosaukumos
Lai iespējotu apgalvojumus tikai pakotnei com.animal
un tās pakotnēm,
java -ea:com.animal… Main
Iespējot apgalvojumu nenosauktos iepakojumos
Lai iespējotu apgalvojumu nenosauktos paketēs (kad mēs neizmantojam pakotnes paziņojumu) pašreizējā darba direktorijā.
java -ea:… Main
Iespējot apgalvojumu sistēmas klasēs
Lai iespējotu apgalvojumu sistēmas klasēs, mēs izmantojam citu komandrindas slēdzi:
java -esa:arguments
VAI
java -enablesystemassertions:arguments
Argumenti, kurus var sniegt šiem slēdžiem, ir vienādi.
Apgalvojumu atspējošana
Lai atspējotu apgalvojumus, mēs izmantojam:
java -da arguments
VAI
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.
Ja apgalvojums ir iespējots, programma darbojas labi. Tomēr, ja apgalvojumi ir atspējoti, saraksta elementi netiek noņemti. Tas var izraisīt programmas kļūmi.
Tā vietā piešķiriet rezultātu mainīgajam un pēc tam izmantojiet šo mainīgo apgalvojumam.
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;
Tādā veidā mēs varam nodrošināt, ka visas nedēļas nogales tiek noņemtas no darba dienām neatkarīgi no tā, vai apgalvojums ir iespējots vai atspējots. Rezultātā tas neietekmē programmas darbību nākotnē.