gpt4 book ai didi

java - 捕获 Throwable 和 StackOverflowError 时的不同行为

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:54:36 31 4
gpt4 key购买 nike

我有下面两套代码

第一组代码如下:

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 (StackOverflowError e) {

}

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

输出是:

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

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

在第二组代码中,我捕获了无法访问 args[0] 的 StackOverflowError。它显示 NullPointerException。

我无法理解 Java 的行为。

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

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

最佳答案

StackOverflowError 将在两段代码中发生。

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

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

这将抛出一个 NullPointerException 因为 argsnull 并且你不能访问 args[0] .

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

关于java - 捕获 Throwable 和 StackOverflowError 时的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32052938/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com