[英]Java throwing Error and catching NullPointerException
这对我来说毫无意义。
第一个例子:
示例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块无法捕获Exception
子类NullPointerException
。 它不知道会抛出哪种异常。
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
。
您试图抛出一个空对象,该对象将失败,并导致引发NullPointerException
。
您应该使用throw new Exception ();
只是为了澄清。 如果您要问为什么第二个示例不能编译,而第四个示例可以编译:
错误及其子类是未经检查的异常,无需在throws
子句中捕获或声明。
未检查的异常类是运行时异常类和错误类 。
( JLS 11.1.1。 )
这就是为什么您可以引发Error
并捕获Exception
,并且代码将进行编译的原因。
另一方面,在第二个示例中,您试图抛出一个检查的异常( Exception
)并捕获一个NullPointerException
,它不是Exception
的超类。 这就是为什么除非您捕获Exception
或声明您的主方法throws Exception
,否则代码不会编译的原因。
有两件事要注意。
首先,抛出NullPointerException
,因为您正在抛出一个null
对象。 这与您尝试引发的异常的声明类型无关。
其次,由于Error
子类是未经检查的异常 ,因此编译器不会抱怨缺少Error
的catch块。 您的第二个示例未编译,因为并非所有Exception
子类都是未经检查的异常。 因此,当编译器遇到throw e
声明,其中声明的类型e
是Exception
,它需要一个catch块Exception
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.