gpt4 book ai didi

java - 为什么 java.lang.ExceptionInInitializerError 没有一个包含消息和原因的构造函数?

转载 作者:行者123 更新时间:2023-11-30 04:23:35 27 4
gpt4 key购买 nike

我使用java.lang.ExceptionInInitializerError重新抛出静态初始化 block 中捕获的异常。我注意到不可能同时使用消息和原因来构建;只有其中之一。

  1. 有充分的理由吗?
  2. 您可以建议什么替代方案来从静态 init block 中将检查的异常重新抛出为未检查的异常?例如:重新抛出为 java.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);
}
}
}

引用号:Why doesn't Java allow to throw a checked exception from static initialization block?

最佳答案

据记录here ,有一个构造函数 ExceptionInInitializerError(Throwable throwed),您可能应该使用它:它符合标准异常链,它保留堆栈跟踪并执行其他有用的操作(请参阅 a sample chained-exception output )。

编辑

this answer 中所述对于您链接到的问题:禁止允许受检查的异常落在 static block 之外;未经检查的异常很好,但无法在任何地方捕获,除非使用 Class.forName 进行手动动态类加载(非常不常见)。

这意味着“祝你好运,捕获你在静态初始化程序中抛出的任何内容”。基本上,无论您构造并抛出什么异常,它都没有多大用处。

关于java - 为什么 java.lang.ExceptionInInitializerError 没有一个包含消息和原因的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16410336/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com