我不明白为什么我不能只在创建实例或抛出异常的同一行中使用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

09-25 21:02