Порядок отчета об исключениях и ошибках - PullRequest
4 голосов
/ 23 ноября 2011

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

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

Оценки включены.

Почему вместо AssertionError сообщается об IllegalArgumentException?Есть ли какие-либо правила, которые применяются в этих ситуациях?

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

Ответы [ 4 ]

6 голосов
/ 23 ноября 2011
Блок

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

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

p.s

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

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

1 голос
/ 23 ноября 2011

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

0 голосов
/ 23 ноября 2011

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

. Что может показаться вам интересным, это то, что даже если у вас есть:*

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

блок finally все равно будет выполнен, и он будет выполнен до выхода из метода.

0 голосов
/ 23 ноября 2011

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

throw new IllegalArgumentException();

, тогда как

assert true

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

...