English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java Управление потоком

Java Массив

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений Java

Java Список (List)

Java Queue (очередь)

Java Map коллекция

Java Set коллекция

Java Вход/Выход (I/O)

Java Reader/Writer

Другие темы Java

Ассерции (Assert) Java

В этом руководстве мы изучим Java assert语句 (Java утверждение) с помощью примеров.

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

Использование ключевого слова assert для утверждения.

Его грамматика:

assert condition;

Здесь condition - это булевое выражение, и мы предполагаем, что оно истинно во время выполнения программы.

Включить утверждения

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

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

java -ea:arguments

Или

java -enableassertions:arguments

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

Но если при включенных утверждениях условие вычисляется в false, JVM выбрасывает AssertionError, и программа немедленно останавливается.

Пример 1: Java утверждение

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

Другой вид объявленияassertions

assert condition : expression;

В этом виде утверждения выражение передается вконструкторAssertionError объекта. Если условиеfalse, значение выражения отображается как детализация ошибки.

Подробные сообщения используются для захвата и передачи информации о сбоеassertions, чтобы помочь отладке проблем.

Пример 2: Пример Java 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 для конкретных классов и пакетов

Если мы не предоставляем никакие параметры командной строке дляключения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

Параметры, которые можно передавать при отключении утверждений, такие же, как и при их включении.

Преимущества утверждений

  1. Быстрая и эффективная детекция и исправление ошибок.

  2. Утверждения проверяются только в процессе разработки и тестирования. Они автоматически удаляются из производственного кода в runtime, поэтому не замедляют выполнение программы.

  3. Это помогает удалить шаблонный код и сделать код более читаемым.

  4. Переоснащение и оптимизация кода для повышения уверенности в его правильном выполнении.

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

1. Недоступный код

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

Давайте приведем пример.

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.

2. Запись предположений

Чтобы записать свои основные предположения, многие программисты используют комментарии. Давайте举个 пример.

if (i % 2 == 0) {
    ...
}
    ...
}

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

С ростом программы комментарии могут стать устаревшими и несинхронизированными. Однако, нам придётся обновлять утверждения;否则, они могут также失败ать из-за действительных условий.

if (i % 2 == 0) {
   ...
}
    assert i % 2 == 1 : i;
    ...
}

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

1. Проверка параметров в общедоступных методах

Пользователь может предоставить параметры в общедоступных методах.

Таким образом, если использовать утверждения для проверки этих параметров, условия могут не сработать и привести к ошибке AssertionError.

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

2. Оценка выражений, влияющих на работу программы

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

Рассмотрим пример с таблицей, 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, не учитывая включен или отключен断ой. В результате, это не повлияет на будущие операции программы.