Что делает ключевое слово «assert»? [Дубликат]

На этот вопрос уже есть ответ:

Что делает assert? Например, в функции:

private static int charAt(String s, int d) {
    assert d >= 0 && d <= s.length();
    if (d == s.length()) return -1;
    return s.charAt(d);
}
134
задан Francesco Menzani 26 September 2015 в 13:47
поделиться

7 ответов

Если вы запустите свою программу с -enableassertions (или ] -ea для краткости), то этот оператор

assert cond;

эквивалентен

if (!cond)
    throw new AssertionError();

. Если вы запустите свою программу без этой опции, оператор assert не будет иметь никакого эффекта.

Например, assert d> = 0 && d <= s.length (); , как указано в вашем вопросе, эквивалентно

if (!(d >= 0 && d <= s.length()))
    throw new AssertionError();

(если вы запустили с -enableassertions то есть.)


Формально, Спецификация языка Java: 14.10. assert Утверждение говорит следующее:

14.10. Утверждение assert
Утверждение - это утверждение assert , содержащее логическое выражение. Утверждение либо включено, либо отключено . Если утверждение разрешено, выполнение утверждения вызывает оценку логического выражения, и выдается сообщение об ошибке , если выражение оценивается как ложь . Если утверждение отключено, выполнение утверждения не имеет никакого эффекта.

Где «включен или отключен» управляется переключателем -ea , а «Сообщается об ошибке» означает, что AssertionError ] брошен.


И, наконец, менее известная функция assert :

Вы можете добавить : «Сообщение об ошибке» следующим образом:

assert d != null : "d is null";

, чтобы указать, какое сообщение об ошибке выброшенное AssertionError должно быть.


Этот пост был переписан в статью здесь .

228
ответ дан 23 November 2019 в 23:55
поделиться

Если условие не выполнено, будет выброшена AssertionError.

Утверждения должны быть включены; в противном случае выражение assert ничего не делает. См.:

http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable

12
ответ дан 23 November 2019 в 23:55
поделиться

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

5
ответ дан 23 November 2019 в 23:55
поделиться

Используйте эту версию оператора assert для предоставления подробного сообщения об ошибке AssertionError. Система передает значение Expression2 соответствующему конструктору AssertionError, который использует строковое представление значения в качестве подробного сообщения об ошибке.

Цель подробного сообщения состоит в том, чтобы зафиксировать и сообщить подробности сбоя утверждения. Сообщение должно позволить вам диагностировать и в конечном итоге исправить ошибку, которая привела к сбою утверждения. Обратите внимание, что подробное сообщение не является сообщением об ошибке на уровне пользователя, поэтому, как правило, нет необходимости делать эти сообщения понятными по отдельности или переводить их на международный уровень. Подробное сообщение предназначено для интерпретации в контексте полной трассировки стека вместе с исходным кодом, содержащим неудачное утверждение.

JavaDoc

1
ответ дан 23 November 2019 в 23:55
поделиться

Он гарантирует, что выражение вернет истину. В противном случае генерируется ошибка java.lang.AssertionError .

http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10

0
ответ дан 23 November 2019 в 23:55
поделиться

Assert выдает AssertionError, если вы запускаете приложение с включенными утверждениями.

int a = 42;
assert a >= 0 && d <= 10;

Если вы запустите это, скажем: java -ea -jar peiska.jar

Выбросит java.lang.AssertionError

0
ответ дан 23 November 2019 в 23:55
поделиться

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

В вашем случае он выполняет проверку данных по входящим параметрам, хотя это не мешает клиентам злоупотреблять функцией в будущем. Особенно, если их нет (и не следует) включать в сборку выпуска.

1
ответ дан 23 November 2019 в 23:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: