Что делает 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.
Это сообщение было переписано как статья здесь.
Если условие не выполняется, будет выбрано AssertionError
.
Утверждения должны быть включены; в противном случае выражение assert
ничего не делает. См:
http://java.sun.com/j2se/1.5.0/docs/guide/language/assert.html#enable-disable
assert
- инструмент отладки, который заставит программу выкинуть исключение AssertionFailed
, если условие не соответствует действительности. В этом случае программа генерирует исключение, если одно из двух условий, следующих за ним, оценивается как false. Вообще говоря, 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. Throw Exception error IF хуже всего происходит (при запуске приложения).
Когда-нибудь, когда вы скомпилируете свой код, вы не получите свой результат, и это ошибка. Но приложение не будет терпеть крах, и вы потратите очень тяжелое время, чтобы найти, где вызывает эту ошибку.
Итак, если вы положили assert, вот так:
assert strA != null; //Adding here
strB = strA .toLowerCase();
вы сообщаете компилятору, что strA абсолютно не является нулевым значением, он может "мирно" отключить предупреждение. Если он равен NULL (в худшем случае), он остановит приложение и бросит вам ошибку, чтобы найти его.
Используйте эту версию оператора assert для предоставления подробного сообщения для AssertionError. Система передает значение Expression2 в соответствующий конструктор AssertionError, который использует строковое представление значения в качестве сообщения об ошибке.
Цель подробного сообщения - захватить и сообщить подробности об ошибке утверждения. Сообщение должно позволить вам диагностировать и в конечном итоге исправить ошибку, которая привела к отказу утверждения. Обратите внимание, что подробное сообщение не является сообщением об ошибке на уровне пользователя, поэтому, как правило, не нужно делать эти сообщения понятными по отдельности или интернационализировать их. Детальное сообщение предназначено для интерпретации в контексте полной трассировки стека в сочетании с исходным кодом, содержащим неудавшееся утверждение.
Утверждения обычно используются прежде всего как средство проверки ожидаемого поведения программы. Это должно привести к сбою в большинстве случаев, поскольку предположения программиста о состоянии программы ложны. В этом случае возникает отладочный аспект утверждений. Они создают контрольную точку, которую мы просто не можем игнорировать, если мы хотим иметь правильное поведение.
В вашем случае это проверка данных по входящим параметрам, хотя это не мешает клиентам злоупотреблять функцией в будущем. Особенно, если они не являются (и не должны) включаться в сборку релизов.
Это гарантирует, что выражение вернет true. В противном случае он выбрасывает 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