Что делает ключевое слово "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, который использует строковое представление значения как подробное сообщение об ошибке.

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

JavaDoc

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

Другие вопросы по тегам