2011-11-23 3 views
4

Какие правила применяются к следующему коду:Исключения и ошибки сообщить порядок

try { 
     assert (false) : "jane"; 
    } catch (Exception e2) { 
     System.out.print("ae2 "); 
    } finally { 
     throw new IllegalArgumentException(); 
    } 

Assetions включены.

Зачем сообщается об ошибке IllegalArgumentException вместо AssertionError? Существуют ли какие-либо правила, которые применяются в таких ситуациях?

Редактировать: Извините! в этом примере должно быть указано (false)

ответ

1

неперехваченного исключение в блоке finally (или в блоке catch) вызывает исключение любых исключений из блока try. Подробности см. На странице Java Language Specification § 14.20. Начиная с Java 7, охватывающий блок try/catch может восстанавливать отброшенные исключения (как описано here).

6

finally блок всегда работает. Значение assert равно true, поэтому блок finally генерирует исключение.

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

p.s

assert Если имеет значение ложь, finally будет работать в любом случае и бросить исключение, вместо этого AssertionError.

Запомните, что блок finally всегда работает, за исключением случаев, когда JVM останавливается в блоке try.

+0

'assert' ничего не возвращает. –

+0

Хорошо, если быть точным, я бы оценил. – Mechkov

+0

Извините, я исправил свой вопрос, утверждают, что он вычисляет false – mmatloka

0

Единственная линия, которая делает что-либо

throw new IllegalArgumentException(); 

тогда

assert true 

ничего не делать, и даже если он сделал это не будет пойман catch(Exception

+0

Извините, я исправил свой вопрос, утверждая, что он вычисляет false – mmatloka

+0

В этом случае ответ заключается в том, что в конечном итоге он выполняется последним и заменяет любое предыдущее действие, кроме 'System .exit(); ' –

0

Блок finally всегда будет выполнен. Единственная ситуация, в которой он не будет выполняться это JVM выключения (т. Е System.exit(-))

То, что вы могли бы найти интересное, что даже если бы:

try { 
    return ...; 
} 
finally { 
    ... 
} 

окончательно блок будет выполняться, и он будет выполнен до метод завершает работу.

+0

Спасибо за ваш ответ. В первый раз я столкнулся с кем-то из PUT в Stackoverflow;) – mmatloka

+0

Хэ, с удовольствием найдем здесь одноклассника ;-) Удачи вам в SCJP. –

+1

Спасибо, сегодня я сдал экзамен со счетом 95%;) – mmatloka