Использование утверждений Java

1. Введение

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

В этой статье мы рассмотрим, как использовать ключевое слово Java assert .

2. История утверждений Java

Ключевое слово Java assert было введено в Java 1.4, так что оно существует довольно давно. Тем не менее, это остается малоизвестным ключевым словом, которое может значительно уменьшить количество шаблонов и сделать наш код более читабельным.

Например, часто в нашем коде нам нужно проверить определенные условия, которые могут помешать правильной работе нашего приложения. Обычно мы пишем что-то вроде этого:

Connection conn = getConnection(); if(conn == null) { throw new RuntimeException("Connection is null"); }

Используя утверждения, мы можем удалить операторы if и throw с помощью одного оператора assert .

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

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

Обратите внимание, что до Java 1.4 было совершенно законно использовать слово «assert» для именования переменных, методов и т. Д. Это потенциально создавало конфликт имен при использовании старого кода с новыми версиями JVM.

Поэтому для обратной совместимости JVM по умолчанию отключает проверку утверждений . Они должны быть явно включены с помощью аргумента командной строки -enableassertions или его сокращения -ea:

java -ea com.baeldung.assertion.Assertion

В этом примере мы включили утверждения для всех классов.

Мы также можем включить утверждения для определенных пакетов и классов:

java -ea:com.baeldung.assertion... com.baeldung.assertion.Assertion

Здесь мы включили утверждения для всех классов в пакете com.baeldung.assertion .

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

4. Использование утверждений Java

Чтобы добавить утверждения, просто используйте ключевое слово assert и задайте ему логическое условие :

public void setup() { Connection conn = getConnection(); assert conn != null; }

Java также предоставляет второй синтаксис для утверждений, который принимает строку, которая будет использоваться для создания AssertionError, если она будет выбрана:

public void setup() { Connection conn = getConnection(); assert conn != null : "Connection is null"; }

В обоих случаях код проверяет, что соединение с внешним ресурсом возвращает ненулевое значение. Если это значение равно нулю, JVM автоматически выдаст AssertionError .

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

Давайте посмотрим на результат запуска нашего класса с включенными утверждениями:

Exception in thread "main" java.lang.AssertionError: Connection is null at com.baeldung.assertion.Assertion.setup(Assertion.java:15) at com.baeldung.assertion.Assertion.main(Assertion.java:10)

5. Обработка AssertionError

Класс AssertionError расширяет Error , который сам расширяет Throwable . Это означает, что AssertionError является непроверенным исключением.

Поэтому методы, использующие утверждения, не обязаны их объявлять, и дальнейший вызывающий код не должен пытаться их поймать.

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

6. Передовой опыт

Самое важное, что нужно помнить об утверждениях, - это то, что их можно отключить, поэтому никогда не предполагайте, что они будут выполнены .

Поэтому при использовании утверждений имейте в виду следующее:

  • Всегда проверяйте наличие нулевых значений и пустых опций, где это необходимо
  • Избегайте использования утверждений для проверки входных данных в общедоступный метод и вместо этого используйте непроверенное исключение, такое как IllegalArgumentException или NullPointerException
  • Не вызывайте методы в условиях утверждения, а вместо этого присваивайте результат метода локальной переменной и используйте эту переменную с assert
  • Утверждения отлично подходят для мест в коде, которые никогда не будут выполнены, таких как случай по умолчанию для оператора switch или после цикла, который никогда не завершается

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

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

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

Как всегда, полный исходный код доступен на GitHub.