Диагностические утверждения(assertion) — это широко распространенные идиомы, применяемые для обеспечения надежности программирования. Допустим, вы убеждены в том, что конкретное свойство уже задано, и ссылаетесь на него в своей программе. Предположим, что вы вычисляете следующее выражение:
1 |
double y = Math.sqrt(x); |
Вы уверены, что число x — неотрицательное. Возможно, оно получено в результате других вычислений, которые не могут порождать отрицательные числа, либо является параметром метода, которому можно передавать лишь положительные числа. Но вы все же хотите еще раз проверить свои предположения, чтобы в ходе выполнения программы не возникло ошибки.
Разумеется, можно было бы просто сгенерировать исключение:
1 |
if(x<0) throw new IllegalArgumentException("x < 0"); |
Однако у такого подхода есть досадный недостаток — код остается в программе, даже если тестирование давно закончено. Если в тексте программы расставлено много таких проверок, ее выполнение может замедлиться.
Механизм диагностических утверждений позволяет вставлять в текст программы проверки, предназначенных для ее тестирования, а затем удалять их из окончательного варианта.
Начиная с версии Java SE 1.4, в языке появилось новое ключевое слово — assert. Оно имеет две формы:
1 |
assert условие; |
и
1 |
assert условие : выражение; |
Оба оператора вычисляют некое условие и генерируют исключение AssertionError, если оно не выполняется. Во втором операторе выражение передается конструктору объекта класса AssertionError и превращается в строку сообщения.
С сайтом avi1.ru проводить трансляции в Перископе будет еще интереснее, так как здесь Вы сможете купить подписчиков или лайки по очень выгодным условиям. На сайте действует гибкая система скидок, а услуги выполняют квалифицированные сотрудники.
Единственная цель выражения при указании ключевого слова assert — создать строку сообщения. Объект класса AssertionError не хранит фактическое значение выражения, поэтому его невозможно использовать в дальнейшем. В документации, поставляемой совместно с JDK, непринужденно говорится, что это сделано для того, чтобы «утешить программистов, если диагностическое утверждение окажется неверным».
Чтобы проверить, является ли значение x неотрицательным числом, можно использовать такой оператор:
1 |
assert x>=0; |
Можно также передать фактическое значение переменной x объекту AssertionError, чтобы он впоследствии вывел его на экран:
1 |
assert x>=0 : x; |
В языке C макрос assert превращает проверяемое условие в строку, которая выводится на экран, если оно не выполняется. Например, если выражение assert(x>=0) имеет значение false, на экран выводится строка, сообщающая, что условие x>=0 не выполняется. В языке Java условие не является неотъемлемой частью сообщения об ошибке. Если вы хотите увидеть его, передайте его в виде строки объекту класса:
1 |
AssertionError:assert x>=0 : "x >= 0" |