Вопрос

Этот вопрос уже имеет ответ здесь:

Что значит 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 Исключение, если условие не соответствует действительности. В этом случае программа будет выбрасывать исключение, если либо из двух условий, следующих за ним, оцениваемым к ложе. Вообще говоря, assert не следует использовать в производственном коде

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

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

Когда у вас такая похожая ситуация:

    String strA = null;
    String strB = null;
    if (2 > 1){
        strA = "Hello World";
    }

    strB = strA.toLowerCase(); 

Вы можете получить предупреждение (отображение желтой линии на STRB = STRE.tolowerCase ();), что STRO может производить нулевое значение для STRB. Хотя вы знаете, что STRB абсолютно не будет нулевым в конце, на всякий случай, вы используете утверждение

1. Отключить предупреждение.

2. Ошибка исключения броска, если происходит худшее (когда вы запускаете свое приложение).

Когда-нибудь, когда вы компилируете свой код, вы не получаете свой результат, и это ошибка. Но приложение не будет сбой, и вы проводите очень трудно найти, где вызывает эту ошибку.

Итак, если вы поставите, как это:

    assert strA != null; //Adding here
    strB = strA .toLowerCase();

Вы говорите компилятору, что Stra абсолютно не нулевое значение, оно может «мирно» отключить предупреждение. Если это NULL (худший случай возникает), он остановит приложение и бросит ошибку для вас, чтобы найти его.

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

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

Javadoc.

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

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

Это гарантирует, что выражение возвращает 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top