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.