Потому что это подпись:
public synchronized Throwable initCause(Throwable cause);
Как видите, тип возвращаемого значения здесь Throwable
;
Выполнение в одну строку равно:
// Throwable is not BadProgramException! It's wider type
private static void rethrowException() throws BadProgramException {
try {
throwException();
} catch (BadCodeException e) {
BadProgramException ex = new BadProgramException("Problem that occurred");
Throwable throwable = ex.initCause(e);
throw throwable;
}
}
Что требует дополнительной обработки. Вы меняете тип ссылки , делая это в одну строку. Ваш метод больше не выбрасывает BadProgramException
. Это бросает шире , верхний тип исключения.
Выполнение в одну строку не меняет тип ссылки:
private static void rethrowException() throws BadProgramException {
try {
throwException();
} catch (BadCodeException e) {
BadProgramException ex = new BadProgramException("Problem that occurred");
ex.initCause(e);
throw ex; // Reference type is still BadProgramException and matches current signature
}
}
В основном, вызов по одной линии может быть решен как:
private static void rethrowException() throws Throwable {
try {
throwException();
} catch (BadCodeException e) {
BadProgramException ex = new BadProgramException("Problem that occurred");
throw ex.initCause(e);
}
}
Но это не хороший подход к выбрасыванию суперкласса всех ошибок, таких как Throwable
Вам нужно бросить как можно более узкий тип исключения.