捕获 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
因为 args
是 null
并且您无法访问 args[0]
.
另一个将处理每个错误或异常,包括这个 NullPointerException
,它会遍历调用中的所有方法,因此代码的执行将继续。好像你正在作为参数传递 "db"
,所以这就是打印的内容。
在第一种情况下,您捕获了所有异常,因此当您使用空值 args
调用 main
时,结果 NullPointerException
被捕获并且您看不到它.
在第二种情况下,您只捕捉到 WhosebugError
,因此尝试访问空数组中的元素所导致的 NullPointerException
未得到处理,您会看到错误。
看起来你只是在这里试验,但值得一提的是,你永远不应该在 'real' 代码中捕获 WhosebugError
。
我有下面两套代码
第一组代码如下:
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
因为 args
是 null
并且您无法访问 args[0]
.
另一个将处理每个错误或异常,包括这个 NullPointerException
,它会遍历调用中的所有方法,因此代码的执行将继续。好像你正在作为参数传递 "db"
,所以这就是打印的内容。
在第一种情况下,您捕获了所有异常,因此当您使用空值 args
调用 main
时,结果 NullPointerException
被捕获并且您看不到它.
在第二种情况下,您只捕捉到 WhosebugError
,因此尝试访问空数组中的元素所导致的 NullPointerException
未得到处理,您会看到错误。
看起来你只是在这里试验,但值得一提的是,你永远不应该在 'real' 代码中捕获 WhosebugError
。