3

我有以下两组代码

第一组代码如下:

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 块中捕获 Throwable,我可以在其中访问命令行参数,即args[0](我可以在控制台中看到 args[0] 输出)。

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

我无法理解 Java 的行为。

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

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

4

2 回答 2

8

StackOverflowError将在两段代码中发生。

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

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

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

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

于 2015-08-17T14:32:02.927 回答
1

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

在第二种情况下,您只是在捕获StackOverflowError,因此NullPointerException未处理尝试访问空数组中的元素而导致的结果,并且您会看到错误。

看起来您只是在这里进行试验,但值得一提的是,您永远不应该StackOverflowError陷入“真实”代码中。

于 2015-08-17T14:33:07.183 回答