English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
В этом руководстве мы изучим Java assert语句 (Java утверждение) с помощью примеров.
Утверждения в Java помогают выявлять ошибки, тестируя код, который мы считаем правильным.
Использование ключевого слова assert для утверждения.
Его грамматика:
assert condition;
Здесь condition - это булевое выражение, и мы предполагаем, что оно истинно во время выполнения программы.
По умолчанию утверждения отключены и игнорируются в процессе выполнения.
Чтобы включить утверждения, мы используем:
java -ea:arguments
Или
java -enableassertions:arguments
При включенных утверждениях и истинном условии программа будет выполняться normalmente.
Но если при включенных утверждениях условие вычисляется в false, JVM выбрасывает AssertionError, и программа немедленно останавливается.
class Main { public static void main(String args[]) { String[] weekends = {"Friday", "Saturday", "Sunday"}; assert weekends.length == 2; System.out.println("Эта неделя имеет " + weekends.length + " выходных"); } }
Результат вывода
В этой неделе есть 3 выходных дня
Мы получаем этот вывод, потому что у программы нет компиляционных ошибок, и по умолчаниюassertions отключены.
После включенияassertions мы получаем следующий вывод:
Exception in thread "main" java.lang.AssertionError
assert condition : expression;
В этом виде утверждения выражение передается вконструкторAssertionError объекта. Если условиеfalse, значение выражения отображается как детализация ошибки.
Подробные сообщения используются для захвата и передачи информации о сбоеassertions, чтобы помочь отладке проблем.
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"); } }
Результат вывода
Exception in thread "main" java.lang.AssertionError: There are only 2 weekends in a week
Из примера выше可以看出, выражение передается вконструкторAssertionError объекта. Если наше предположение неверноеfalseи включеныassertions,则会引发异常并显示一条适当的消息。
Это сообщение помогает диагностировать и исправлять ошибки, вызывающие сбойassertions.
Если мы не предоставляем никакие параметры командной строке дляключенияassertions,
java -ea
Это включаетassertions во всех классах, кроме системных классов.
Мы также можем использовать параметры для включенияassertions для конкретных классов и пакетов. Параметры, которые можно предоставить этим командным строковым переключателям:
Включениеassertions в имени класса
Чтобы включитьassertions для всех классов программыMain,
java -ea Main
Включается только один класс,
java -ea:AnimalClass Main
Это позволяет использоватьassertions только в классеAnimalClass программыMain.
Включениеassertions в имени пакета
Для включенияassertions для пакетаcom.animal и его подпакетов
java -ea:com.animal... Main
Включение утверждений в анонимном пакете
Включение утверждений в анонимном пакете в текущей рабочей директории (когда мы не используем команду package).
java -ea:... Main
Включение утверждений в системных классах
Чтобы включить утверждения в системных классах, мы используем разные командные строки:
java -esa:arguments
или
java -enablesystemassertions:arguments
Параметры, которые можно передавать этим переключателям, такие же.
Чтобы отключить утверждения, мы используем:
java -da arguments
или
java -disableassertions arguments
Чтобы отключить утверждения в системных классах, мы используем:
java -dsa:arguments
или
java -disablesystemassertions:arguments
Параметры, которые можно передавать при отключении утверждений, такие же, как и при их включении.
Быстрая и эффективная детекция и исправление ошибок.
Утверждения проверяются только в процессе разработки и тестирования. Они автоматически удаляются из производственного кода в runtime, поэтому не замедляют выполнение программы.
Это помогает удалить шаблонный код и сделать код более читаемым.
Переоснащение и оптимизация кода для повышения уверенности в его правильном выполнении.
Недоступный код — это код, который не будет выполняться при запуске программы. Использование утверждений помогает убедиться, что недоступный код действительно недоступен.
Давайте приведем пример.
void unreachableCodeMethod() { System.out.println("Доступный код"); return; // Недоступный код System.out.println("Недоступный код"); assert false; }
Давайте еще раз рассмотрим пример switch-выражения без условия по умолчанию.
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; }
Верхний switch-выражение показывает, что дни недели могут быть только одними из семи указанных значений. Отсутствие default означает, что программист уверен, что одно из этих условий всегда будет выполнено.
Но в некоторых случаях, когда предположения ошибочны, могут не учитываться некоторые ситуации.
Следует использовать утверждения для проверки этого предположения, чтобы убедиться, что не достигнутаdefault switch-условие.
default: assert false: dayofWeek + " is invalid day";
Если значение dayOfWeek не является действительной датой, выбросьте AssertionError.
Чтобы записать свои основные предположения, многие программисты используют комментарии. Давайте举个 пример.
if (i % 2 == 0) { ... } ... }
Используйте утверждения.
С ростом программы комментарии могут стать устаревшими и несинхронизированными. Однако, нам придётся обновлять утверждения;否则, они могут также失败ать из-за действительных условий.
if (i % 2 == 0) { ... } assert i % 2 == 1 : i; ... }
Пользователь может предоставить параметры в общедоступных методах.
Таким образом, если использовать утверждения для проверки этих параметров, условия могут не сработать и привести к ошибке AssertionError.
Лучше позвольте возникновению соответствующих исключений времени выполнения и обработайте их, чем использовать утверждения.
Не вызывайте методы или не оценивайте исключения, которые могут повлиять на работу программы в условиях утверждения.
Рассмотрим пример с таблицей, weekdays список содержит имена всех дней недели.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")); ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Sunday", "Saturday")); assert weekdays.removeAll(weekends);
Здесь мы пытаемся удалить элементы Saturday и Sunday из ArrayList weekdays.
Если включены утверждения, то программа может работать корректно. Однако, если они отключены, элементы из списка не будут удалены. Это может привести к сбою программы.
вместо этогоassign результат в переменную, а затем использовать переменную для утверждения.
ArrayList<String> weekdays = new ArrayList<>(Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")); ArrayList<String> weekends = new ArrayList<>(Arrays.asList("Sunday", "Saturday")); boolean weekendsRemoved = weekdays.removeAll(weekends); assert weekendsRemoved;
Таким образом, мы можем обеспечить удаление всех weekends из weekdays, не учитывая включен или отключен断ой. В результате, это не повлияет на будущие операции программы.