捕获 Throwable 和 StackOverflowError 时的不同行为

Different behaviour while catching Throwable and StackOverflowError

我有下面两套代码

第一组代码如下:

public static void main(String[] args){
    try {
        main(null);
    } catch (Throwable e) {
    }

    System.out.println("Value of args[0] is : "args[0]);
}

输出为:

Value of args[0] is : db

第二组代码如下:

public static void main(String[] args){
    try {
        main(null);
    } catch (WhosebugError e) {

    }

    System.out.println(args[0]);
}

输出为:

Exception in thread "main" java.lang.NullPointerException
at com.way2learnonline.ui.Demo.main(Demo.java:16)

在这两种情况下,我都传递了一个命令行参数,即 'db'。 在第一组代码中,我在 catch 块中捕获了 Throwable,我可以在其中访问命令行参数,即 args[0](我可以在控制台中看到 args[0] 输出)。

在第二组代码中,我发现无法访问 args[0] 的 WhosebugError。它显示 NullPointerException。

我无法理解 Java 的行为。

为什么我可以在第一种情况下访问 args[0],为什么在第二种情况下 args 为空。

有人可以解释为什么 java 会这样吗?

WhosebugError 将在两段代码中发生。

捕获WhosebugError的代码将在该方法的最后一次递归调用中处理它,但由于catch什么都不做,因此将执行下一行代码:

System.out.println(args[0]);

这将抛出 NullPointerException 因为 argsnull 并且您无法访问 args[0].

另一个将处理每个错误或异常,包括这个 NullPointerException,它会遍历调用中的所有方法,因此代码的执行将继续。好像你正在作为参数传递 "db",所以这就是打印的内容。

在第一种情况下,您捕获了所有异常,因此当您使用空值 args 调用 main 时,结果 NullPointerException 被捕获并且您看不到它.

在第二种情况下,您只捕捉到 WhosebugError,因此尝试访问空数组中的元素所导致的 NullPointerException 未得到处理,您会看到错误。

看起来你只是在这里试验,但值得一提的是,你永远不应该在 'real' 代码中捕获 WhosebugError