【发布时间】:2014-12-22 10:43:00
【问题描述】:
这对我来说没有意义。
第一个例子:
示例 1(良好):
public static void main(String args[]){
try {
Exception e = null;
throw e;
} catch (Exception e) {
}
这段代码一切正常 - 抛出并捕获异常。
示例 2(错误):
public static void main(String args[]){
try {
Exception e = null;
throw e;
} catch (NullPointerException e) {
}
}
这将无法编译,因为 catch 块无法捕获 NullPointerException,它是 Exception 的子类。它不知道会抛出什么样的异常。
java.lang.Object
java.lang.Throwable
java.lang.Exception --> Thrown
java.lang.RuntimeException
java.lang.NullPointerException --> Cannot catch like this
所以让我们把异常改成NullPointerException:
示例 3(好)
public static void main(String args[]) {
try {
NullPointerException e = null;
throw e;
} catch (NullPointerException e) {
}
简单而合乎逻辑,但这里有一些非常奇怪的东西:
示例 4(好)- 不知道为什么?:
public static void main(String args[]) {
try {
Error e = null;
throw e;
} catch (NullPointerException e) {
}
如果我抛出Error,我怎么能抓住NullPointerException?这没有道理。
有:
可抛出:错误、异常
Error 和Exception 都是Throwable 的子类,但NullPoinTerException 与Error 无关,它是Exception,而不是Error。
【问题讨论】:
-
这些例子都不好。你从哪里弄来的?
-
你确定
catch (NullPointerException e)赶上Error吗? -
是的,这就是我的问题的重点:)
-
JLS 14.18: "如果表达式的评估正常完成,产生一个
null值,那么将创建并抛出类NullPointerException的实例V'而不是null。然后 throw 语句突然完成,原因是带有值V'的 throw。" -
这个问题似乎离题了,因为 OP 错误地描述了包含明显悖论的示例 2。
标签: java exception nullpointerexception