Java抛出错误并捕获NullPointerException

时间:2014-10-27 09:24:47

标签: java exception nullpointerexception

这对我来说毫无意义。

第一个例子:

示例1(好):

public static void main(String args[]){
        try {
            Exception e = null;
            throw e;
        } catch (Exception e) {
        }

使用代码一切都很好 - 异常被抛出并被捕获。

示例2(BAD):

public static void main(String args[]){
    try {
        Exception e = null;
        throw e;
    } catch (NullPointerException e) {
    }
}

这将无法编译,因为catch块无法捕获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) {
    }

如果我抛出Error,我怎么能抓住NullPointerException?这没有道理。

有:

Throwable:错误,异常

ErrorException都是Throwable的子类,但NullPoinTerExceptionError无关,它是Exception 1}},而不是Error

2 个答案:

答案 0 :(得分:8)

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

您应该使用throw new Exception ();

抛出异常

只是澄清一下。如果你问为什么你的第二个例子没有编译,而第四个例子确实如此:

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

  

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

JLS 11.1.1.

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

另一方面,在第二个示例中,您尝试抛出一个已检查的异常(Exception)并捕获NullPointerException,这不是Exception的超类。这就是为什么代码不会编译,除非你抓住Exception或声明你的主要方法throws Exception

答案 1 :(得分:1)

有两点需要注意。

首先,抛出NullPointerException因为你正在抛出一个null对象。这与您尝试抛出的异常的声明类型无关。

其次,由于Error的子类是未经检查的异常,编译器不会抱怨Error的catch块丢失。您的第二个示例没有编译,因为Exception的所有子类都不是未经检查的异常。因此,当编译器遇到声明throw e类型为e的{​​{1}}语句时,它需要Exception的catch块。