Что делает 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);
}
Что делает 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);
}
Если вы запускаете свою программу с -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.
Этот пост был переписан как статья, которую здесь.
assert
для тестирования закрытого метода предварительное условие совершенно верно ИМО.
- person Pascal Thivent; 11.06.2010
assert
, из производственного кода?
- person Qbik; 04.07.2016
-enableassertions
в конфигурацию отладки Android Studio?
- person Felix; 09.10.2016
-enableassertions
в производстве, как упоминалось выше.
- person Franklin Yu; 03.01.2017
Если условие не выполняется, будет выброшено AssertionError
.
Однако утверждения должны быть разрешены; в противном случае выражение assert
ничего не делает. Видеть:
http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
assert
- это инструмент отладки, который заставляет программу генерировать AssertionFailed
исключение, если условие не истинно. В этом случае программа выдаст исключение, если одно из двух следующих за ней условий оценивается как ложное. Вообще говоря, assert
не следует использовать в производственном коде
AssertionError
, как и любое другое исключение.
- person Richard Fearn; 11.06.2010
-ea
.
- person aioobe; 11.06.2010
Хотя я прочитал много документации об этом, я все еще не понимаю, как, когда и где его использовать.
Сделайте это очень простым для понимания:
Когда у вас есть подобная ситуация вроде этой:
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, который использует строковое представление значения в качестве подробного сообщения об ошибке.
Цель подробного сообщения состоит в том, чтобы зафиксировать и сообщить подробности сбоя утверждения. Сообщение должно позволить вам диагностировать и в конечном итоге исправить ошибку, которая привела к сбою утверждения. Обратите внимание, что подробное сообщение не является сообщением об ошибке на уровне пользователя, поэтому, как правило, нет необходимости делать эти сообщения понятными по отдельности или переводить их на международный уровень. Подробное сообщение предназначено для интерпретации в контексте полной трассировки стека вместе с исходным кодом, содержащим неудачное утверждение.
Утверждения обычно используются в основном как средство проверки ожидаемого поведения программы. В большинстве случаев это должно приводить к сбою, поскольку предположения программиста о состоянии программы ложны. Вот тут-то и появляется отладочный аспект утверждений. Они создают контрольную точку, которую мы просто не можем игнорировать, если хотим иметь правильное поведение.
В вашем случае он выполняет проверку данных по входящим параметрам, хотя это не мешает клиентам злоупотреблять функцией в будущем. Особенно, если их нет (и не следует) включать в сборку выпуска.
Это гарантирует, что выражение вернет истину. В противном случае выдается java.lang.AssertionError
.
http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.10
Assert выдает ошибку AssertionError, если вы запускаете приложение с включенными утверждениями.
int a = 42;
assert a >= 0 && d <= 10;
Если вы запустите это, скажите: java -ea -jar peiska.jar
Он должен выбросить java.lang.AssertionError