2015-11-28 2 views
2

Я готовлюсь к OCP 7, и я столкнулся с этим эссе в одной из этих книг с сертификатами.AssertionError and assert

Чтобы отговорить вас от попыток заменить утверждение в течение исключения, AssertionError не предоставляет доступа к объекту , создавшего его. Все, что вы получаете, это сообщение String.

Я пробовал много возможностей, чтобы вести то, что говорится, но я не нашел разницы на AssertionError с другими.

Можете ли вы объяснить мне, что означает эта цитата?

ответ

3

Объяснение можно найти в the FAQ in the documentation из assert ключевого слова:

Почему AssertionError не позволяет доступ к объекту, который генерирует его? Аналогично, почему бы не передать произвольный объект из утверждения в конструктор AssertionError вместо подробного сообщения?

Доступ к этим объектам будет способствовать тому, что программисты попытаются восстановиться после сбоев утверждения, что приведет к поражению цели объекта.

Рассмотрим следующий код:

int i = 0; 
assert i != 0 : "i must not be zero" 

Если утверждения включены, это будет бросаться AssertionError с сообщением инициализируется "i must not be zero". Но все это будет содержать эту ошибку. Если он будет содержать больше информации, это побудит разработчиков как-то оправиться от ошибки, поймав AssertionError. Теоретически, все еще можно проверить сообщение об ошибке и попытаться что-то сделать с ним, но тогда вы действительно противоречите каждой хорошей практике.

+0

Это не объясняет, потому что класс AssertionError унаследовал методы от Throwable без добавления или переопределения чего-либо вроде IOException, например. – Aladdin

+0

@Aladdin Существует разница между бросанием 'AssertionError' самостоятельно и тем, что автоматически выбрано ключевым словом' assert'. Если вы бросите его сами, вы можете дать ему объект, но ключевое слово 'assert' не сделает этого. – Tunaki

Смежные вопросы