【问题标题】:Is there any significance by catching Error(not Exception) as the program will not be initiated by the JVM捕获错误(不是异常)是否有任何意义,因为程序不会由JVM启动
【发布时间】:2014-06-19 02:29:29
【问题描述】:

我从question 了解到,当一些ErrorNoClassDefFoundError 出现在Java 中时

这是一个非常严重的错误,因为程序无法由 JVM 启动。

那么:

try {
    //statements
} catch (NoClassDefFoundError e) { // catching NoClassDefFoundError 
    e.printStackTrace();
    //do something when Error occurred
} catch(Error e){ // catching Error
    e.printStackTrace();
    //do something when Error occurred
}catch (Exception e) {
    e.printStackTrace();
    //do something when Exception occurred
}

问题:

  • 在try catch块中捕获Error是否有任何意义,因为JVM不会启动程序,这些块是否会执行?

  • 如果不是,那么为什么在 Java 中允许捕获Error 的机制。如果是,那么何时以及如何?

【问题讨论】:

标签: java exception-handling error-handling try-catch


【解决方案1】:

在您使用自定义类加载器加载类的情况下,可能会出现插件 jar(例如,自定义类加载器用于从这些 jar 加载类并且这些 jar 是由用户创建的)的情况在类加载期间。在这些时间点,最好捕获这些类型的错误并记录它们。

正如其他人指出的那样,您对此无能为力。

【讨论】:

    【解决方案2】:

    Java 中的异常处理旨在处理程序中的危险行为,但Errors 代表严重的问题,不应被捕获。

    一般来说,不建议捕捉Errors,而只建议捕捉Exceptions(选中或未选中)。以下是来自Error 的 JAVA API 的行:

    错误是 Throwable 的子类,表示合理的应用程序不应尝试捕获的严重问题。大多数此类错误是异常情况。 ThreadDeath 错误虽然是“正常”情况,但也是 Error 的子类,因为大多数应用程序不应尝试捕获它。

    方法不需要在其 throws 子句中声明任何可能在方法执行期间抛出但未被捕获的 Error 子类,因为这些错误是不应该发生的异常情况。也就是说,为了在编译时检查异常,Error 及其子类被视为未经检查的异常。

    【讨论】:

      【解决方案3】:

      您可以捕获错误。但是,通常您不应该这样做,因为在大多数情况下您无能为力。如果发生错误,几乎总是为时已晚。不过,在极少数情况下,可能有助于捕获错误:When to catch java.lang.Error?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-26
        • 2013-07-16
        • 1970-01-01
        • 1970-01-01
        • 2018-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多