Отладочный механизм assertion для Java

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

Попытка обработать ситуацию появления отрицательного возраста может выглядеть следующим образом:

int age = ob.getAge();

if (age >= 0) {

// реализация

} else {

// сообщение о неправильных данных

}

Теперь механизм assertion позволяет создать код, который будет генерировать исключение на этапе отладки проверки постусловия или промежуточных данных в виде:

int age = ob.getAge();

assert (age >= 0): "NEGATIVE AGE!!!";

// реализация

Правописание инструкции assert:

assert (boolexp): expression;

assert (boolexp);

Выражение boolexp может принимать только значение типов boolean или Boolean, а expression – любое значение, которое может быть преобра­зовано к строке. Если логическое выражение получает значение false, то гене­рируется исключение AssertionError, и выполнение программы прекращается с выводом на консоль значения выражения expression (если оно задано).

Механизм assertion хорошо подходит для проверки инвариантов, например, перечислений:

enum Mono { WHITE, BLACK }

String str = "WHITE";//"GRAY"

Mono mono = Mono.valueOf(str);

//

switch (mono) {

case WHITE : //

break;

case BLACK : //

break;

default :

assert false : "Colored!";

}

Создателями языка не рекомендуется использовать assertion при проверке параметров public-методов. В таких ситуациях лучше генерировать исключения одного из типов: IllegalArgumentException, NullPointerException или собственное исключение. Нет также особого смысла в механизме assertion при проверке пограничных значений переменных, поскольку исключительные ситуации генерируются в этом случае без посторонней помощи.

Assertion можно включать для отдельных классов и пакетов при запуске виртуальной машины в виде:

java –enableassertions MyClass

или

java –ea MyClass

Для выключения применяется da или disableassertions.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100