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

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

    14,10. Утверждение
    Утверждение - это утверждение, содержащее булево выражение. Утверждение включено или отключено . Если это утверждение включено, выполнение утверждения вызывает оценку булевого выражения и сообщается об ошибке, если выражение оценивается как 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 исключение 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 to

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

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

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

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

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

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

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

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

    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

    Давайте будем гением компьютера.