Что делает ключевое слово Java assert и когда его следует использовать? - PullRequest
563 голосов
/ 03 мая 2010

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

Ответы [ 18 ]

4 голосов
/ 05 февраля 2014

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

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

Мне нравится, но я не знаю, как включить его в Eclipse / Android / ADT. Кажется, он выключен даже при отладке. (В этом есть поток, но он ссылается на «Java vm», который не отображается в конфигурации запуска ADT).

3 голосов
/ 18 мая 2017

Вот утверждение, которое я написал на сервере для проекта Hibernate / SQL. Компонент-сущность имеет два фактически булевых свойства: isActive и isDefault. Каждый из них может иметь значение «Y» или «N» или ноль, что рассматривается как «N». Мы хотим убедиться, что клиент браузера ограничен этими тремя значениями. Итак, в мои сеттеры для этих двух свойств я добавил следующее утверждение:

assert new HashSet<String>(Arrays.asList("Y", "N", null)).contains(value) : value;

Обратите внимание на следующее.

  1. Это утверждение только для этапа разработки. Если клиент отправляет неверное значение, мы поймем это рано и исправим это задолго до того, как достигнем производства. Утверждения относятся к дефектам, которые вы можете обнаружить рано.

  2. Это утверждение медленное и неэффективное. Это нормально. Утверждения могут быть медленными. Нам все равно, потому что это инструменты только для разработки. Это не замедлит рабочий код, потому что утверждения будут отключены. (Есть некоторые разногласия по этому вопросу, к которым я вернусь позже.) Это приводит к моей следующей точке.

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

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

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

Некоторые люди утверждают, что вы никогда не должны использовать утверждения, потому что вы никогда не можете быть уверены, что все ошибки исчезли, поэтому вам нужно держать их рядом даже в производстве. И поэтому нет смысла использовать оператор assert, поскольку единственное преимущество утверждений состоит в том, что вы можете отключить их. Следовательно, в соответствии с этим мнением, вы (почти) никогда не должны использовать утверждения. Я не согласен. Это правда, что если тест относится к производству, вы не должны использовать assert. Но этот тест не относится к производству. Эта ошибка предназначена для обнаружения ошибки, которая вряд ли когда-либо достигнет производства, поэтому ее можно безопасно отключить, когда вы закончите.

Кстати, я мог бы написать это так:

assert value == null || value.equals("Y") || value.equals("N") : value;

Это хорошо только для трех значений, но если число возможных значений становится больше, версия HashSet становится более удобной. Я выбрал версию HashSet, чтобы сделать вывод об эффективности.

2 голосов
/ 23 октября 2015

Утверждения по умолчанию отключены. Чтобы включить их, мы должны запустить программу с параметрами -ea (степень детализации может быть различной). Например, java -ea AssertionsDemo.

Существует два формата использования утверждений:

  1. Простой: например. assert 1==2; // This will raise an AssertionError.
  2. Лучше: assert 1==2: "no way.. 1 is not equal to 2"; Это вызовет AssertionError с отображаемым сообщением, и, следовательно, будет лучше. Хотя фактический синтаксис - assert expr1:expr2, где expr2 может быть любым выражением, возвращающим значение, я использовал его чаще, просто чтобы напечатать сообщение.
2 голосов
/ 11 июня 2012

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

Утверждение работает во время выполнения. Простой пример, который может очень просто объяснить всю концепцию, приведен здесь - Что делает ключевое слово assert в Java? (WikiAnswers).

1 голос
/ 31 июля 2017

Подводя итог (и это верно для многих языков, не только Java):

«assert» в основном используется в качестве средства отладки разработчиками программного обеспечения во время процесса отладки. Assert-сообщения никогда не должны появляться. Многие языки предоставляют опцию времени компиляции, при которой все «утверждения» игнорируются для использования при генерации «рабочего» кода.

«Исключения» - это удобный способ обработки всевозможных состояний ошибок, независимо от того, представляют ли они логические ошибки или нет, потому что, если вы столкнетесь с состоянием ошибок, которое вы не сможете продолжить, вы можете просто «выбросить их в воздух, откуда бы вы ни были, ожидая, что кто-то еще будет готов «поймать» их. Управление передается за один шаг, прямо из кода, который вызвал исключение, прямо в перчатку ловца. (И ловец может видеть полный обратный след звонков.)

Кроме того, вызывающим этой подпрограммы не нужно проверять, успешно ли выполнена подпрограмма: «если мы здесь сейчас, она должна была быть успешной, потому что в противном случае она вызвала бы исключение, и мы бы не стали» не будь здесь сейчас! " Эта простая стратегия значительно упрощает разработку и отладку кода.

Исключительно удобно, чтобы условия фатальной ошибки были такими, какие они есть: «исключения из правила». И для них должен обрабатываться кодовый путь, который также является «исключением из правила ... « fly ball! »

0 голосов
/ 24 апреля 2013

assert является ключевым словом. Он был введен в JDK 1.4. Два типа assert s

  1. Очень простые assert заявления
  2. Простые assert заявления.

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

0 голосов
/ 21 октября 2018

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

  • Их нельзя использовать для проверки аргументов открытых методов, поскольку вы не можете их контролировать.
  • Их не следует использовать для простых проверок, таких как result != null, поскольку такие проверки очень быстрые, и сохранить их практически нечего.

Итак, что осталось? Дорогой проверяет, действительно ли условия ожидаются , чтобы быть правдой. Хорошим примером могут служить инварианты структуры данных, такой как RB-дерево. На самом деле, в ConcurrentHashMap JDK8 есть несколько таких значимых утверждений для TreeNodes.

  • Вы действительно не хотите включать их в производство, поскольку они могут легко доминировать во время выполнения.
  • Возможно, вы захотите включить или выключить их во время испытаний.
  • Вы определенно хотите включить их при работе с кодом.
0 голосов
/ 10 февраля 2014

По сути, «assert true» пройдет, а «assert false» потерпит неудачу. Давайте посмотрим, как это будет работать:

public static void main(String[] args)
{
    String s1 = "Hello";
    assert checkInteger(s1);
}

private static boolean checkInteger(String s)
{
    try {
        Integer.parseInt(s);
        return true;
    }
    catch(Exception e)
    {
        return false;
    }
}
...