В този урок ще научим за изявлението на Java за твърдение (Java твърдения) с помощта на примери.
Твърденията в Java помагат за откриване на грешки чрез тестване на код, който приемаме за верен.
Твърдението се прави с помощта на assert
ключовата дума.
Синтаксисът му е:
assert condition;
Тук condition
е булев израз, който приемаме за истина, когато програмата се изпълнява.
Активиране на твърдения
По подразбиране твърденията са деактивирани и игнорирани по време на изпълнение.
За да активираме твърдения, използваме:
java -ea:arguments
ИЛИ
java -enableassertions:arguments
Когато твърденията са разрешени и условието е true
, програмата се изпълнява нормално.
Но ако условието прецени, false
докато твърденията са разрешени, JVM изхвърля AssertionError
и програмата спира незабавно.
Пример 1: Утвърждение на 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"); ) )
Изход
Има 3 уикенда в седмицата
Получаваме горния изход, тъй като тази програма няма грешки при компилацията и по подразбиране твърденията са деактивирани.
След активиране на твърдения получаваме следния изход:
Изключение в нишка "main" java.lang.AssertionError
Друга форма на твърдение
assert condition : expression;
В тази форма на твърдение, израз се предава на конструктора на AssertionError
обекта. Този израз има стойност, която се показва като съобщение за подробности за грешката, ако условието е false
.
Подробното съобщение се използва за улавяне и предаване на информацията за неуспешното твърдение, за да помогне за отстраняване на грешки в проблема.
Пример 2: Утвърждаване на Java с пример за израз
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"); ) )
Изход
Изключение в нишка "main" java.lang.AssertionError: Има само 2 уикенда в седмицата
Както виждаме от горния пример, изразът се предава на конструктора на AssertionError
обекта. Ако нашето предположение е false
и твърденията са разрешени, се изпраща изключение с подходящо съобщение.
Това съобщение помага при диагностицирането и отстраняването на грешката, довела до неуспеха на твърдението.
Активиране на твърдение за конкретни класове и пакети
Ако не предоставим никакви аргументи на превключвателите на командния ред на твърдение,
java -ea
Това дава възможност за твърдения във всички класове с изключение на системните класове.
Също така можем да активираме твърдение за конкретни класове и пакети, използвайки аргументи. Аргументите, които могат да бъдат предоставени на тези превключватели на командния ред, са:
Активиране на твърдение в имена на класове
За да активирате твърдение за всички класове от нашата програма Main,
java -ea Main
За да активирате само един клас,
java -ea:AnimalClass Main
Това дава възможност за твърдение само AnimalClass
в Main
програмата.
Активиране на твърдение в имена на пакети
За да разрешите твърдения само за пакета com.animal
и неговите подпакети,
java -ea:com.animal… Main
Активиране на твърдение в неназовани пакети
За да активирате твърдение в неназовани пакети (когато не използваме израз на пакети) в текущата работна директория.
java -ea:… Main
Активиране на твърдение в системни класове
За да активираме твърдение в системни класове, използваме различен превключвател на командния ред:
java -esa:arguments
ИЛИ
java -enablesystemassertions:arguments
Аргументите, които могат да бъдат предоставени на тези ключове, са едни и същи.
Деактивиране на твърдения
За да деактивираме твърденията, използваме:
java -da arguments
ИЛИ
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.
Ако твърдението е активирано, програмата работи добре. Ако обаче твърденията са деактивирани, елементите от списъка не се премахват. Това може да доведе до неуспех на програмата.
Вместо това присвойте резултата на променлива и след това използвайте тази променлива за твърдение.
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;
По този начин можем да гарантираме, че всички почивни дни са премахнати от делничните дни, независимо от твърдението, което е активирано или деактивирано. В резултат на това това не оказва влияние върху работата на програмата в бъдеще.