static initializer:测试ExceptionInInitializerError

时间:2016-02-21 11:11:48

标签: java

我正在为我的证书考试学习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呢? 在运行时抛出相同的异常时,错误将显示为已承诺 我去浏览其他文章,但找不到答案。 这是一个了解考试的重要问题,但它出现在一些模拟问题中。

编译错误:

  

初始化程序无法正常完成

2 个答案:

答案 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语句中。