Перейти к основному содержимому

Использование Java Assertions

· 4 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Введение

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

В этой статье мы рассмотрим, как использовать ключевое слово 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.foreach.assertion.Assertion

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

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

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

Здесь мы включили утверждения для всех классов в пакете com.foreach.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.foreach.assertion.Assertion.setup(Assertion.java:15)
at com.foreach.assertion.Assertion.main(Assertion.java:10)

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

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

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

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

6. Лучшие практики

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

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

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

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

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

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

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