捕获Throwable和StackOverflowError时的不同行为

时间:2015-08-17 14:25:57

标签: java exception-handling nullpointerexception throwable

我有以下两组代码

第一组代码如下:

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]输出)。

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

我无法理解Java的行为。

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

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

2 个答案:

答案 0 :(得分:8)

StackOverflowError将在两段代码中发生。

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

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

由于NullPointerExceptionargs,因此您将无法访问null,这将导致args[0]

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

答案 1 :(得分:1)

在第一种情况下,您正在捕获所有例外情况,因此当您使用main的空值调用args时,结果NullPointerException会被捕获,您无法看到它

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

看起来你只是在这里进行实验,但值得一提的是,你永远不应该抓住StackOverflowError真实的'代码。