未捕获 Java 异常

2022-08-31 20:02:46

为什么Java中的一些异常没有被捕获?这是代码完全失败,并有一个未处理的异常。(Java 版本 1.4)。catch (Exception ex)

public static void main(String[] args) {
    try {
        //Code ...
    } catch (Exception ex) {
        System.err.println("Caught Exception");
        ex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    }
    finally {
        app.shutdown();
    }
    System.exit(exitCode);
}

我得到一个Exception in thread "main" java.lang.NoSuchMethodError

但这有效

public static void main(String[] args) {
    int exitCode = app.SUCCESS_EXIT_CODE;
    try {
        //Code ...
    } catch (java.lang.NoSuchMethodError mex){
        System.err.println("Caught NoSuchMethodError");
        mex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    } catch (Exception ex) {
        System.err.println("Caught Exception");
        ex.printStackTrace();
        exitCode = app.FAILURE_EXIT_CODE;
    }
    finally {
        app.shutdown();
    }
    System.exit(exitCode);
}

我得到Caught NoSuchMethodError java.lang.NoSuchMethodError:

我以为捕获异常会捕获所有异常吗?如何捕获 Java 中的所有异常?


答案 1

因为有些异常不是从 - 例如 和。ExceptionThrowableError

基本上,类型层次结构是:

       Object
         |
      Throwable
     /         \
Exception      Error

只有派生的类可以被抛出,所以如果你抓住 ,那真的会抓住一切。ThrowablesThrowable

Throwable以及从其他派生的异常派生的异常都算作已检查的异常 - 它们是您必须声明将抛出的异常,或者如果您调用抛出它们的东西,则捕获它们。ExceptionExceptionRuntimeException

总而言之,Java异常层次结构有点混乱...


答案 2

错误s 不是异常s。

类 Exception 及其子类是 Throwable 的一种形式,它指示合理的应用程序可能想要捕获的条件。

-- JavaDoc for java.lang.Exception

Error 是 Throwable 的一个子类,它指示合理的应用程序不应尝试捕获的严重问题。

-- JavaDoc for java.lang.Error

您可能希望捕获某些错误,例如 ThreadDeath。ThreadDeath被归类为错误,如下所述

类 ThreadDeath 是 Error 而不是 Exception 的子类,即使它是“正常发生”,因为许多应用程序捕获所有异常的发生,然后丢弃异常。

-- JavaDoc for ThreadDeath

但是,由于 Thread 的 stop() 方法现已弃用,因此您不应使用它,因此您永远不应该看到 ThreadDeath。