我有以下两组代码
第一组代码如下:
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的行为会像这样吗?
答案 0 :(得分:8)
StackOverflowError
将在两段代码中发生。
代码捕获StackOverflowError
将在方法的最后一次递归调用中处理它,但由于catch
什么都不做,所以下一行代码将被执行:
System.out.println(args[0]);
由于NullPointerException
为args
,因此您将无法访问null
,这将导致args[0]
。
另一个将处理每个错误或异常,包括此NullPointerException
,它将通过调用中的所有方法,因此代码的执行将继续。好像你正在作为参数"db"
传递,所以这就是打印的内容。
答案 1 :(得分:1)
在第一种情况下,您正在捕获所有例外情况,因此当您使用main
的空值调用args
时,结果NullPointerException
会被捕获,您无法看到它
在第二种情况下,您只捕获StackOverflowError
,因此不会处理因尝试访问空数组中的元素而导致的NullPointerException
,并且您会看到错误。
看起来你只是在这里进行实验,但值得一提的是,你永远不应该抓住StackOverflowError
真实的'代码。