Ствердження Java (заява про ствердження)

У цьому підручнику ми дізнаємося про твердження 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і твердження увімкнено, виникає виняток із відповідним повідомленням.

Це повідомлення допомагає діагностувати та виправити помилку, яка спричинила збій твердження.

Увімкнення твердження для певних класів та пакетів

Якщо ми не надаємо жодних аргументів для перемикачів командного рядка твердження,

 ява -еа 

Це дозволяє твердження у всіх класах, крім системних класів.

We can also enable assertion for specific classes and packages using arguments. The arguments that can be provided to these command-line switches are:

Enable assertion in class names

To enable assertion for all classes of our program Main,

 java -ea Main

To enable only one class,

 java -ea:AnimalClass Main

This enables assertion in only the AnimalClass in the Main program.

Enable assertion in package names

To enable assertions for package com.animal and its sub-packages only,

 java -ea:com.animal… Main

Enable assertion in unnamed packages

To enable assertion in unnamed packages (when we don’t use a package statement) in the current working directory.

 java -ea:… Main

Enable assertion in system classes

To enable assertion in system classes, we use a different command-line switch:

 java -esa:arguments 

OR

 java -enablesystemassertions:arguments

The arguments that can be provided to these switches are the same.

Disabling Assertions

To disable assertions, we use:

 java -da arguments 

OR

 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.

Якщо твердження ввімкнено, програма працює нормально. Однак, якщо твердження вимкнено, елементи зі списку не видаляються. Це може призвести до збою програми.

Натомість призначте результат змінній, а потім використовуйте цю змінну для твердження.

 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; 

Таким чином, ми можемо гарантувати, що всі вихідні будуть видалені з робочих днів, незалежно від того, яке твердження ввімкнено чи вимкнено. Як результат, це не впливає на роботу програми в майбутньому.

Цікаві статті...