Подтвердить что ты не робот

Что делает ключевое слово "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);
}
4b9b3361

Ответ 1

Если вы запустите свою программу с помощью -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.


Это сообщение было переписано как статья здесь.

Ответ 3

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

Ответ 4

Хотя я прочитал много документации об этом, я все еще запутался в том, как, когда и где его использовать.

Сделайте это очень просто:

Если у вас есть аналогичная ситуация:

    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 (в худшем случае), он остановит приложение и бросит вам ошибку, чтобы найти его.

Ответ 5

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

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

JavaDoc

Ответ 6

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

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

Ответ 8

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

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

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

Он должен выбросить java.lang.AssertionError