Что делает ключевое слово "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);
}
8 ответов
Если вы запускаете свою программу с -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
оператор, содержащий логическое выражение. Утверждение либо включено, либо отключено. Если утверждение включено, выполнение утверждения приводит к вычислению логического выражения и сообщается об ошибке, если выражение оценивается какfalse
, Если утверждение отключено, выполнение подтверждения не имеет никакого эффекта.
Где "включен или отключен" контролируется с -ea
Переключатель и "Сообщение об ошибке" означает, что AssertionError
брошен
И, наконец, менее известная особенность assert
:
Вы можете добавить : "Error message"
как это:
assert d != null : "d is null";
указать, каким должно быть сообщение об ошибке брошенного AssertionError.
Этот пост был переписан как статья здесь.
Если условие не выполняется, AssertionError
будет брошен.
Утверждения должны быть включены, хотя; в противном случае assert
выражение ничего не делает. Увидеть:
http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html
assert
это инструмент отладки, который заставит программу AssertionFailed
исключение, если условие не соответствует действительности. В этом случае программа сгенерирует исключение, если одно из двух следующих за ней условий оценивается как ложное. Вообще говоря, assert
не должен использоваться в производственном коде
Хотя я прочитал много документации об этом, я все еще не понимаю, как, когда и где его использовать.
Сделать это очень просто для понимания:
Когда у вас есть похожая ситуация, как это:
String strA = null;
String strB = null;
if (2 > 1){
strA = "Hello World";
}
strB = strA.toLowerCase();
Вы можете получить предупреждение (с желтой линией на strB = strA.toLowerCase();), что strA может выдать значение NULL для strB. Хотя вы знаете, что strB абсолютно не будет нулевым, в конце концов, вы используете assert для
1. Отключите предупреждение.
2. Сгенерировать ошибку исключения, если случится худшее (когда вы запускаете приложение).
Иногда, когда вы компилируете свой код, вы не получаете свой результат, и это ошибка. Но приложение не будет аварийно завершено, и вы потратите очень много времени, чтобы найти причину этой ошибки.
Итак, если вы поставите assert, вот так:
assert strA != null; //Adding here
strB = strA .toLowerCase();
вы говорите компилятору, что strA абсолютно не является нулевым значением, оно может "мирно" отключить предупреждение. Если оно равно NULL (в худшем случае), оно остановит приложение и выдаст вам ошибку, чтобы найти его.
Утверждения обычно используются главным образом как средство проверки ожидаемого поведения программы. В большинстве случаев это должно приводить к сбою, поскольку предположения программиста о состоянии программы ложны. Вот тут-то и возникает аспект отладки утверждений. Они создают контрольную точку, которую мы просто не можем игнорировать, если хотим иметь правильное поведение.
В вашем случае он выполняет проверку данных по входящим параметрам, хотя это не мешает клиентам использовать эту функцию в будущем. Особенно, если они не (и не должны) быть включены в релизные сборки.
Используйте эту версию оператора assert, чтобы предоставить подробное сообщение для AssertionError. Система передает значение Expression2 соответствующему конструктору AssertionError, который использует строковое представление значения как подробное сообщение об ошибке.
Цель подробного сообщения состоит в том, чтобы захватить и сообщить подробности ошибки подтверждения. Сообщение должно позволить вам диагностировать и, в конечном итоге, исправить ошибку, которая привела к сбою утверждения. Обратите внимание, что подробное сообщение не является сообщением об ошибке на уровне пользователя, поэтому, как правило, нет необходимости делать эти сообщения понятными в отдельности или интернационализировать их. Подробное сообщение предназначено для интерпретации в контексте трассировки полного стека в сочетании с исходным кодом, содержащим ошибочное утверждение.
Assert генерирует AssertionError, если вы запускаете приложение с включенными утверждениями.
int a = 42;
assert a >= 0 && d <= 10;
Если вы запускаете это с помощью: java -ea -jar peiska.jar
Он должен бросить java.lang.AssertionError
Это гарантирует, что выражение возвращает истину. В противном случае он бросает java.lang.AssertionError
,
http://java.sun.com/docs/books/jls/third_edition/html/statements.html