Java抛出错误并捕获NullPointerException

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:错误,异常

这两个ErrorException是的子类Throwable,但NullPoinTerException有什么用Error,这是一个Exception,不是Error.

Era*_*ran 8

您正在尝试抛出一个失败的null对象,并导致抛出一个对象NullPointerException.

你应该抛出异常 throw new Exception ();

只是为了澄清.如果你问为什么你的第二个例子不编译,而第四个例子做:

错误及其子类是未经检查的异常,不必在throws子句中捕获或声明.

未经检查的异常类是运行时异常类和错误类.

(JLS 11.1.1.)

这就是为什么你可以抛出Error并捕获一个Exception,代码将编译.

另一方面,在你的第二个例子中,你试图抛出一个已检查的异常(Exception)并捕获一个NullPointerException不是超类的Exception.这就是为什么除非你捕获Exception或声明你的主要方法,否则代码将无法编译throws Exception.

  • @RichardK因为Error不需要try-catch,但Exception确实如此 (2认同)