Я случайно заметил, что этот оператор throw
(извлеченный из более сложного кода) компилирует:
void foo() {
try {
} catch (Throwable t) {
throw t;
}
}
В течение короткого, но счастливого момента я подумал, что проверенные исключения, наконец, решили просто умереть уже, но это все еще вызывает возмущение:
void foo() {
try {
} catch (Throwable t) {
Throwable t1 = t;
throw t1;
}
}
Блок try
не должен быть пустым; кажется, что он может иметь код, пока этот код не выдает проверенное исключение. Это кажется разумным, но мой вопрос в том, какое правило в спецификации языка описывает это поведение? Насколько я могу судить, §14.18 Заявление о выбросе явно запрещает его, поскольку тип выражения t
является проверенным исключением, и он не пойман или не объявлен брошенным. (?)