Java apgalvojumi (apgalvojuma apgalvojums)

Š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 assertatslēgvārdu.

Tās sintakse ir:

 assert condition;

Šeit conditionir 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 falsebrī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 AssertionErrorobjekta 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 AssertionErrorobjekta konstruktoram . Ja mūsu pieņēmums ir falseun 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ā Mainprogrammā.

Iespējot apgalvojumu pakotņu nosaukumos

Lai iespējotu apgalvojumus tikai pakotnei com.animalun 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

  1. Quick and efficient for detecting and correcting bugs.
  2. 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.
  3. It helps remove boilerplate code and make code more readable.
  4. 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ē.

Interesanti raksti...