«1. Введение

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

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

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";
}

В обоих случаях код проверяет, что соединение с внешним ресурсом возвращает ненулевое значение. Если это значение равно 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 Don’ t вызывать методы в условиях утверждения и вместо этого присваивать результат метода локальной переменной и использовать эту переменную с утверждением. Утверждения отлично подходят для мест в коде, которые никогда не будут выполняться, например, в случае оператора switch по умолчанию или после цикл, который никогда не заканчивается

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

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

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

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