这对我来说毫无意义。
第一个例子:
示例1(好):
public static void main(String args[]){
try {
Exception e = null;
throw e;
} catch (Exception e) {
}
使用代码一切都很好 - 异常被抛出并被捕获。
示例2(BAD):
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
?这没有道理。
有:
Throwable:错误,异常
Error
和Exception
都是Throwable
的子类,但NullPoinTerException
与Error
无关,它是Exception
1}},而不是Error
。
答案 0 :(得分:8)
您正在尝试抛出一个失败的null对象,并导致NullPointerException
被抛出。
您应该使用throw new Exception ();
只是澄清一下。如果你问为什么你的第二个例子没有编译,而第四个例子确实如此:
错误及其子类是未经检查的异常,不必在throws
子句中捕获或声明。
未经检查的异常类是运行时异常类和错误类。
这就是为什么你可以抛出一个Error
并捕获一个Exception
,代码将被编译。
另一方面,在第二个示例中,您尝试抛出一个已检查的异常(Exception
)并捕获NullPointerException
,这不是Exception
的超类。这就是为什么代码不会编译,除非你抓住Exception
或声明你的主要方法throws Exception
。
答案 1 :(得分:1)
有两点需要注意。
首先,抛出NullPointerException
因为你正在抛出一个null
对象。这与您尝试抛出的异常的声明类型无关。
其次,由于Error
的子类是未经检查的异常,编译器不会抱怨Error
的catch块丢失。您的第二个示例没有编译,因为Exception
的所有子类都不是未经检查的异常。因此,当编译器遇到声明throw e
类型为e
的{{1}}语句时,它需要Exception
的catch块。