是否可以捕获ExceptionInInitializerError?

时间:2016-08-13 10:09:26

标签: java

任何Throwable都可以被抓住

class CatchThrowable {      
  public static void main(String[] args){
    try{
      throw new Throwable();
    } catch (Throwable t){
      System.out.println("throwable caught!");
    }
  }
}

输出:

throwable caught!

因此,如果我在初始化块期间做了一些不好的事情,我希望能够捕获ExceptionInInitializerError。但是,以下不起作用:

class InitError {
  static int[] x = new int[4];
  static {                                                           //static init block
    try{
      x[4] = 5;                                                      //bad array index!
    } catch (ExceptionInInitializerError e) {
      System.out.println("ExceptionInInitializerError caught!");
    } 
  }           
  public static void main(String[] args){}
}

输出:

java.lang.ExceptionInInitializerError
Caused by: java.lang.ArrayIndexOutOfBoundsException: 4
    at InitError.<clinit>(InitError.java:13)
Exception in thread "main" 

如果我更改代码以另外捕获ArrayIndexOutOfBoundsException

class InitError {
  static int[] x = new int[4];
  static {                                                           //static init block
    try{
      x[4] = 5;                                                      //bad array index!
    } catch (ExceptionInInitializerError e) {
      System.out.println("ExceptionInInitializerError caught!");
    } catch (ArrayIndexOutOfBoundsException e){
      System.out.println("ArrayIndexOutOfBoundsException caught!");
    }
  }           
  public static void main(String[] args){}
}

它被捕获的ArrayIndexOutOfBoundsException:

ArrayIndexOutOfBoundsException caught!

有谁可以告诉我为什么会这样?

1 个答案:

答案 0 :(得分:3)

顾名思义,ExceptionInInitializerError是一个错误,不是例外。与例外情况不同,errors are not meant to be caught。它们表示致命的不可恢复的状态,并且意味着停止你的计划。

ExceptionInInitializerError表示static变量的初始值设定项引发了一个未被捕获的异常 - 在您的情况下,它是ArrayIndexOutOfBoundsException,但任何异常都会导致此错误。由于静态初始化发生在正在运行的程序的上下文之外,因此无法传递异常。这就是为什么Java会产生错误而不是传递异常的原因。