Утверждение Java: пример ключевого слова «assert»

Ключевое слово Java assert используется для создания утверждений в Java, которые позволяют нам проверять предположения о нашей программе. Например, утверждение может быть направлено на то, чтобы убедиться, что возраст сотрудника является положительным числом и больше 18.

Операторы утверждений Java содержат логическое выражение, которое должно быть истинным при выполнении утверждения. Если оно не истинно, система выдаст AssertionError, если утверждения были включены с помощью флага -ea.

 Человек человек = новый Человек(1L, "Локеш", 14);assert person.age() >= 18 : "Возраст меньше 18"; //Ошибка выполнения "java.lang.AssertionError: Возраст меньше 18"

1. Синтаксис утверждений Java

Утверждающее утверждение будет иметь одну из двух форм:

assert expression1;//orassert expression1 : expression2;

Здесь —

  • выражение1 — это логическое выражение, которое система оценивает как истинное для обычной обработки, а если оно ложно, выдает AssertionError без подробного сообщения.
  • expression2 — это выражение, которое является значением. Оно не может быть вызовом метода, объявленного как void. Система передает значение expression2 соответствующему конструктору AssertionError, который использует строковое представление значения в качестве подробного сообщения об ошибке.

Вторую форму утверждения следует использовать вместо первой только в тех случаях, когда в программе имеется дополнительная информация, которая может помочь диагностировать сбой.

Как и все неперехваченные исключения, ошибки утверждений обычно помечаются в трассировке стека с указанием файла и номера строки, из которой они были выданы.

2. Пример утверждения Java

Оператор assert может помочь в поддержке программирования в стиле design-by-contract. Его можно использовать для проверки предварительных условий, постусловий и других общих утверждений.

Например, для записи о человеке мы хотим обеспечить соблюдение контракта, согласно которому возраст человека должен быть больше 18 лет.

record Person(Long id, String name, int age) {}public class AssertExample {public static void main(String[] args) {Person person = new Person(1L, "Lokesh", 40);//Passes successfullyassert person.age() >= 18 : "Age is less than 18";}}

Это помогает в случаях, когда возраст человека оказывается ниже ожидаемого.

Person person = new Person(1L, "Lokesh", 14);//Fails with AssertionErrorassert person.age() >= 18 : "Age is less than 18";

Это приводит к сбою с настроенным сообщением для легкой отладки.

$ java -ea .\AssertExample.javaException in thread "main" java.lang.AssertionError: Age is less than 18at com.howtodoinjava.core.basic.AssertExample.main(AssertExample.java:14)

В приведенном выше примере посмотрите на сообщение об ошибке утверждения. Оно выводит «Возраст меньше 18», что говорит о том, что значение параметра было проверено и не прошло проверку. Это помогает при отладке.

3. Включение и отключение утверждений

По умолчанию утверждения отключены.

Иногда утверждения могут увеличивать накладные расходы на выполнение программы. Чтобы гарантировать, что утверждения не являются бременем производительности в развернутых приложениях, утверждения можно включать и отключать при запуске программы. После отключения они по сути эквивалентны пустым операторам в семантике и производительности.

  • Чтобы включить утверждения с различной степенью детализации, используйте ключ -enableassertions или -ea.
  • Чтобы отключить утверждения на разных уровнях детализации, используйте параметр -disableassertions или -da.

Степень детализации можно определить следующим образом:

Уровень детализации Пример команды Описание
Нет аргументов java -ea Основной Включает утверждения во всех классах, кроме системных.
Имя пакета java -ea:com.howtodoinjava.dao… Главная Включает утверждения в названных пакетах и любых подпакетах.
Неназванные пакеты в текущем рабочем каталоге java -ea:… Основной Включает утверждения в безымянном пакете в текущем рабочем каталоге.
Имя класса java -ea:com.howtodoinjava.dao.RolesDao Главный Включает утверждения только в указанном классе.
Смешанный режим java -ea:com.howtodoinjava.dao… -da:com.howtodoinjava.dao.RolesDao Главный Включает утверждения в пакете com.howtodoinjava.dao, но не в классе com.howtodoinjava.dao.RolesDao.

4. Когда не следует использовать утверждения?

Хотя утверждения полезны для подтверждения предположений, мы не должны использовать их слепо. Например:

  • Не включайте утверждения в производственном коде. Они могут привести к снижению производительности из-за дополнительных проверок во время выполнения.
  • Утверждения не являются альтернативой правильной обработке ошибок с использованием блоков try-catch и валидаций с использованием аннотаций JSR-380.
  • Не используйте утверждения для проверки предположений, связанных с безопасностью, так как они будут отключены в рабочей среде.

5. Заключение

Ключевое слово 'assert' в Java является ценным инструментом. Включая утверждения во время разработки и тестирования, вы можете выявлять проблемы на ранних этапах, документировать предположения и создавать более надежное и поддерживаемое программное обеспечение.

Мы должны использовать их разумно и отключать в рабочем коде, чтобы гарантировать, что производительность приложения не пострадает.

Прокрутить вверх