我正在为我的证书考试学习ExceptionInInitializerError
很明显,只能从静态初始化程序块中抛出未经检查的(运行时)异常(未检查),但它没有向我解释为什么会发生以下情况:
public class Test {
static{
//throw new NumberFormatException(); //Doesn't compile
//int num = Integer.parseInt("sd", 16); //Compiles
}
public static void main(String[] args) {
System.out.println("test");
}
}
当我抛出new NumberFormatException
时,编译器不允许它
为什么不抛出ExceptionInInitializerError
呢?
在运行时抛出相同的异常时,错误将显示为已承诺
我去浏览其他文章,但找不到答案。
这是一个了解考试的重要问题,但它出现在一些模拟问题中。
编译错误:
初始化程序无法正常完成
答案 0 :(得分:4)
来自Java语言规范:
如果静态初始化程序无法正常完成,则为编译时错误(§14.21) https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:981494932508,第258页
进一步说:
中断,继续,返回或抛出语句无法正常完成 Chapter 8.7,第462页
答案 1 :(得分:2)
不知道你看到了什么错误,但在Eclipse中我得到以下内容:
初始化程序无法正常完成
这完美地解释了为什么它不会编译。创建一个无条件失败的静态块是没有意义的,编译器正在调用它。
解决方案:使异常成为条件,即将其移到if
语句中。