这对我来说没有意义。
第一个例子:
示例 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 block 无法捕获 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) {
}
如果我抛出一个错误
,我该如何捕获NullPointerException
?这个不成立。
有:
Throwable:错误、异常
Error
和Exception
都是Throwable
的子类,但是NullPointerException
与无关>错误
,这是一个Exception
,而不是Error
。
最佳答案
您正试图抛出一个空对象,但失败了,并导致抛出一个 NullPointerException
。
您应该使用 throw new Exception ();
抛出异常
只是为了澄清。如果您问为什么第二个示例无法编译,而第四个示例可以:
Error 及其子类是未经检查的异常,不必在 throws
子句中捕获或声明。
The unchecked exception classes are the run-time exception classes and the error classes.
( JLS 11.1.1. )
这就是为什么您可以抛出一个 Error
并捕获一个 Exception
,并且代码会编译。
另一方面,在您的第二个示例中,您试图抛出一个检查异常 (Exception
) 并捕获一个 NullPointerException
,这不是父类(super class)异常
。这就是为什么除非您捕获 Exception
或声明您的主方法 throws Exception
,否则代码不会编译。
关于Java 抛出错误并捕获 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26584426/