3

我用来在静态初始化块java.lang.ExceptionInInitializerError中重新抛出捕获的异常。我注意到不可能同时使用消息和原因进行构建。只有一个或另一个。

  1. 有充分的理由吗?
  2. 您可以建议哪些替代方法将已检查的异常作为静态 init 块中的未检查异常重新抛出?例如:Rethrow asjava.lang.RuntimeException允许消息和原因。

更新:澄清 #2 并添加示例代码。

public class Sample {

    private static final String _FILE_PATH = "blah/blah/blah";

    static {
        try {
            FileReader in = new FileReader(new File(_FILE_PATH));
        }
        catch (FileNotFoundException e) {
            // Option A: Without context message
            throw new ExceptionInInitializerError(e);
            // Option B: With context message
            String msg = String.format("Failed to open file for reading: '%s'", _FILE_PATH);
            throw new RuntimeException(msg, e);
        }
    }
}

参考:为什么 Java 不允许从静态初始化块中抛出已检查的异常?

4

3 回答 3

1

如此所述,有一个构造函数ExceptionInInitializerError(Throwable thrown),您可能应该使用它:它符合标准异常链,它保留堆栈跟踪并执行其他有用的东西(请参阅示例链异常输出)。

编辑

正如您链接到的问题的答案static中所述:禁止允许检查的异常从块中掉出;未经检查的异常很好,但不能在任何地方被捕获,除非使用Class.forName非常罕见)进行手动动态类加载。

这转化为“祝你好运捕捉到你在静态初始化程序中抛出的任何东西”。基本上,无论您构造和抛出什么异常,它都没有多大用处。

于 2013-05-07T02:45:15.247 回答
1

您想通过消息(您编写的)和异常本身引发异常。我喜欢这样做,为错误和异常提供上下文。我会抛出异常(或扩展异常或子类的异常类的实例),而不是 RuntimeException,因为您可能希望检查异常。对?

一般来说,您应该在系统可能从异常和运行时异常(未检查)中恢复(在更高级别)的情况下抛出已检查的异常,而系统不能。(詹姆斯·高斯林的观点)

于 2013-05-07T02:48:44.030 回答
0

这是一个错误。通常,错误是应用程序甚至不应该尝试捕获和恢复的错误。

至于为什么它没有包含消息和原因的构造函数,可能是因为该类的开发人员认为没有必要,因为该类的主要目的是让您知道“糟糕,发生了兄弟,可以恢复不了……”

我个人认为其中之一足以识别错误。

于 2013-05-07T02:48:07.233 回答