2016-05-30 10 views
1

Предположим, что у меня есть класс с именем BugException, который продолжается от RuntimeException И у BugException есть конструктор копирования, который принимает Throwable.Throwable and Exception in Java

Этот код компилируется и typechecks:

Throwable e = ...; 
if (e instanceof BugException) { 
    throw new BugException(e); 
} 

Почему это, что:

Throwable e = ...; 
if (e instanceof BugException) { 
    throw e; 
} 

не компилируется и выдает сообщение об ошибке: необработанное исключение. java.lang.Throwable. ?

Почему эта ненужная упаковка необходима для того, чтобы удовлетворить требованиям typechecker?

+1

Тестирование 'instanceof' не изменяет статический тип' e'. – user2357112

+0

Или вы можете просто бросить, без обертки. – pvg

ответ

3

Во время компиляции он не знает, какое исключение e есть. Это может быть проверенное Exception, и в этом случае компилятору понадобится либо обернуть throw в try/catch, либо сделать метод бросить его.

Однако, если вы явно отменили исключение, отмеченное unchecked, оно будет скомпилировано.

Throwable e = ...; 
if (e instanceof BugException) { 
    throw (BugException) e; 
} 

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

  • Нет связанных вопросов^_^