我不明白为什么我不能只在创建实例或抛出异常的同一行中使用initCause()
。如果我把它放在同一行,编译器会认为该方法必须抛出一个可抛出对象。
// All exceptions in the example are subclass of Exception class;
private static void throwException() throws BadCodeException {
throw new BadCodeException("Actual cause");
}
private static void rethrowException() throws BadProgramException{
try {
throwException();
} catch (BadCodeException e) {
BadProgramException ex = new BadProgramException("Problem that occurred");
ex.initCause(e);
throw ex;
} /* catch (BadCodeException e) { // Compiler tells about unhandled Throwable;
throw new BadProgramException("Problem that occurred").initCause(e);
} */
另外,如果有人告诉我是否正确使用链式异常,我会感到很高兴,因为这是我发现的。
最佳答案
如khelwood所述,initCause
的声明返回类型为Throwable
(请检查API文档)。因此,如果抛出initCause
的结果,则(就编译器所知),您的方法可能抛出任何类型的Throwable
。
要回答您的其他问题,执行链接异常的正常方法是
throw new BadProgramException("Problem that occurred", e);
如果没有这样的构造函数,则向
BadProgramException
添加另一个构造函数,该构造函数仅使用两个参数调用super
。这种方法没有这个问题。仅当
initCause
是无法修改以向其添加额外的构造函数的旧类时,才需要调用BadProgramException
。