has*_*ian 3 java enums exception
这是一个描述我的问题的简化类:
public class Main {
    enum Test{
        First(method()){ // Unhandled exception type Exception
            // ...
        };
        Test(Object obj){
            //...
        }
    }
    static Object method() throws Exception{
        // ...
        if (someCondition){
            throw new Exception();
        }
    }
}
以上someCondition依赖于设备和某些情况下,我不能在这件事现在决定,也正如你所看到的,我不想抓Exception的method。
是的。这是一个编译错误。
不。没有特殊的语法来处理这个问题。
我不想在方法中捕获异常。
不幸的是,如果您抛出一个已检查的异常,则必须在调用堆栈中进一步捕获它。这是 Java 语言的基本设计原则,也是编译器严格执行的原则。
在这种情况下,无法捕获已检查的异常。因此,如果您要在 enum 常量参数中调用方法(根据您的代码),则该方法不能抛出已检查的异常1。
这是一个可能的解决方法,尽管这可能是一个坏主意:
public class Main {
    enum Test{
        First(methodCatchingException()){
            // ...
        };
        Test(Object obj){
            //...
        }
    }
    static Object method() throws Exception{
        // ...
        if (someCondition){
            throw new Exception();
        }
    }
    static Object methodCatchingException() {
        try {
            return method();
        } catch (Exception ex) {
            throw new SomeRuntimeException("the sky is falling!", ex);
        }
    }
}
看待这个问题的另一种方法是问问自己应该如果编译器让你写与异常发生......和一个异常被抛出?它会去哪里?
enum初始化就像一个static初始化。所以,这对我说的是 Java 语言设计是正确的,Java 编译器是正确的……这里真正的问题在于您的应用程序设计:
您不应该在这里传播受检查的异常。如果在此上下文中发生异常,则绝对不是可恢复的错误。
也许不建议为此使用枚举......因为可能会出现不可恢复的初始化错误。
(请注意,如果此方法调用因未经检查的异常而终止,则会将其转换为ExceptionInInitializerError。此外,JVM 会将enum类标记为不可初始化,NoClassDefFoundError如果您的应用程序尝试使用它,则会抛出;例如通过Class.forName(...)。)
我假设Exception这里用于说明目的。将方法声明为throws Exception或为throw new Exception(...) 
1 - 我查看了 JLS 以寻求支持。据我所知,规范没有提到这种情况。我原以为会在JLS 11.2.3 中看到它。但是,很明显,编译器不能允许受检异常在那时传播,因为它会“破坏”受检异常如何工作的模型。
| 归档时间: | 
 | 
| 查看次数: | 12221 次 | 
| 最近记录: |