Ric*_*rdK 1 java exception nullpointerexception
这对我来说没有意义.
第一个例子:
例1(好):
public static void main(String args[]){
try {
Exception e = null;
throw e;
} catch (Exception e) {
}
Run Code Online (Sandbox Code Playgroud)
这些代码一切都很好 - 异常被抛出和捕获.
例2(坏):
public static void main(String args[]){
try {
Exception e = null;
throw e;
} catch (NullPointerException e) {
}
}
Run Code Online (Sandbox Code Playgroud)
这将无法编译,因为catch块无法捕获NullPointerException
哪个是子类Exception
.它不知道会抛出什么样的异常.
java.lang.Object
java.lang.Throwable
java.lang.Exception --> Thrown
java.lang.RuntimeException
java.lang.NullPointerException --> Cannot catch like this
Run Code Online (Sandbox Code Playgroud)
所以让我们将异常更改为NullPointerException
:
例3(好)
public static void main(String args[]) {
try {
NullPointerException e = null;
throw e;
} catch (NullPointerException e) {
}
Run Code Online (Sandbox Code Playgroud)
简单而合乎逻辑,但这里有一些非常奇怪的东西:
例4(好) - 不明白为什么?:
public static void main(String args[]) {
try {
Error e = null;
throw e;
} catch (NullPointerException e) {
}
Run Code Online (Sandbox Code Playgroud)
如果我扔了Error
,我该怎么抓NullPointerException
?这没有道理.
有:
Throwable:错误,异常
这两个Error
和Exception
是的子类Throwable
,但NullPoinTerException
有什么用Error
,这是一个Exception
,不是Error
.
您正在尝试抛出一个失败的null对象,并导致抛出一个对象NullPointerException
.
你应该抛出异常 throw new Exception ();
只是为了澄清.如果你问为什么你的第二个例子不编译,而第四个例子做:
错误及其子类是未经检查的异常,不必在throws
子句中捕获或声明.
未经检查的异常类是运行时异常类和错误类.
这就是为什么你可以抛出Error
并捕获一个Exception
,代码将编译.
另一方面,在你的第二个例子中,你试图抛出一个已检查的异常(Exception
)并捕获一个NullPointerException
不是超类的Exception
.这就是为什么除非你捕获Exception
或声明你的主要方法,否则代码将无法编译throws Exception
.
归档时间: |
|
查看次数: |
1480 次 |
最近记录: |