当前位置: 首页 > 面试题库 >

是否有可能捕获ExceptionInInitializerError?

空英逸
2023-03-14
问题内容

任何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!

谁能告诉我为什么呢?


问题答案:

顾名思义,这ExceptionInInitializerError是一个错误,而不是例外。与异常不同,错误并不意味着被捕获。它们表示致命的不可恢复状态,旨在停止您的程序。

ExceptionInInitializerError表示static变量的初始化程序引发了一个尚未捕获的异常-
在您的情况下为ArrayIndexOutOfBoundsException,但是任何异常都会导致此错误。由于静态初始化发生在正在运行的程序的上下文之外,因此没有地方可以传递异常。这就是Java产生错误而不是传递异常的原因。



 类似资料:
  • 问题内容: 我正在开发一个需要大量内存的程序,并且我想在内存不足异常发生时捕获。我听说这是不可能的,但对此是否有所发展感到好奇。 问题答案: 这也不例外。这是一个错误:java.lang.OutOfMemoryError 当它从Throwable下降时,你可以捕获它: 但是,除非你要进行一些相当具体的工作(例如,在特定代码段内分配大量工作),否则你可能将无法捕捉到它,因为你将不知道它将从何处抛出。

  • 问题内容: 此问题与跨域资源共享(CORS)有关。 如果在发出CORS请求时出现错误,Chrome(以及AFAIK其他浏览器)会将错误记录到错误控制台。消息示例可能如下所示: XMLHttpRequest无法加载。原产地不被访问控制允许来源允许的。 我想知道是否有办法以编程方式获取此错误消息?我尝试将调用包装在try/catch中,也尝试添加事件处理程序。两者均未收到错误消息。 问题答案: 看到:

  • 这个问题不是关于Rollbar tho:)

  • 在用户批准付款后,用参数调用return_url,并调用APIendpoint来捕获订单。 在我的paypal developer dashboard检查后,我注意到sandbox buyer账户的paypal余额被扣除了该金额,但sandbox store owner(商业账户)没有将其paypal余额添加到该金额。 在检查了paypal developer仪表板中的通知后,我注意到了两个通知,

  • 问题内容: 我们遇到了一个奇怪的问题,其中似乎有两个线程正在调用,然后在方法内部永远等待。从外部看,内部看起来像是一个僵局。 到目前为止,我们只看到这种情况发生一次。 谁能想到任何可能导致这些症状的东西? 编辑 :相关线程的线程转储在这里: 问题答案: 可能不是您想要的答案,但这可能是JVM错误。看到 http://bugs.sun.com/bugdatabase/view_bug.do?bug_

  • 问题内容: 使用Twitter4j API是否可以获得100条以上的推文? 如果是这样,谁能指出这样做的方法? 问题答案: 需要查看您的代码以提供特定于您的案例的代码示例,但是您可以通过或进行操作。 此信息适用于Twitter API。 要获取 前 100条推文: 在您刚刚通过查询检索的集合中找到 最低的 ID 使用设置为您刚刚找到的ID 的选项执行相同的查询。 要获取 接下来的 100条推文: