trycatch块中的NullPointerException

时间:2016-06-22 08:19:47

标签: java exception nullpointerexception try-catch try-catch-finally

我正在研究try-catch块。 这里我们通过blowup()抛出NullPointerException ,即使我们可以分配

Exception e = new NullPointerException();

BlewIt类再次是一个Exception类。 所以我们抛出的异常必须在catch块中捕获,但它没有。

class BlewIt extends Exception {
    BlewIt() { }
    BlewIt(String s) { super(s); }
}
class Test {
    static void blowUp() throws BlewIt {
        throw new NullPointerException();
    }
    public static void main(String[] args) {
        try {
            blowUp();
        } catch (BlewIt b) {
            System.out.println("Caught BlewIt");
        } finally {
            System.out.println("Uncaught Exception");
        }
    }
}

输出:

Uncaught Exception
Exception in thread "main" java.lang.NullPointerException
        at Test.blowUp(Test.java:7)
        at Test.main(Test.java:11)

但是如果你编写这样的代码,它运行正常:

try {
    blowUp();
    } catch (Exception b) {
        System.out.println("Caught BlewIt");
    } finally {
        System.out.println("Uncaught Exception");
    }

现在BlewIt是NullPointerException类型,但我仍然得到相同的输出。

class BlewIt extends NullPointerException {
    BlewIt() {
    }

    BlewIt(String s) {
        super(s);
    }
}


class Test {
    static void blowUp() throws BlewIt {
        throw new NullPointerException();
    }

    public static void main(String[] args) {
        Exception e = new NullPointerException();
        try {
            blowUp();
        } catch (BlewIt b) {
            System.out.println("Caught BlewIt");
        } finally {
            System.out.println("Uncaught Exception");
        }
    }
}

请帮我解决背后的概念。

3 个答案:

答案 0 :(得分:3)

NullPointerException不是BlewIt的子类。因此,抓住BlewIt并不会抓住NullPointerException

如果您想抓住BlewIt,则应throw new BlewIt () blowUp() {/ 1}}。

答案 1 :(得分:1)

您正在抛出NullPointerException并且您的catch块正在捕获BlewIt,因此它会直接转到finally阻止并打印未捕获的异常,堆栈跟踪为NullPointerException

您的catch块只会捕获类型BlewIt及其子类型的异常。

修改

class BlewIt extends NullPointerException

这会使BlewIt成为NullPointerException的子类,反之亦然。因此,您仍然无法通过NullPointerException

抓住BlewIt

答案 2 :(得分:1)

简单地说,当BlewIt扩展Exception时,BlewIt成为异常的子类,并不意味着它会捕获NullPointerException。

static void blowUp() throws BlewIt {
    throw new NullPointerException();
}

但是,由于NullPointerException不是一个已检查的异常,因此您的代码将被编译。

但是当您稍后在代码中抛出NullPointer异常并尝试通过catch块捕获它时,正如预期的那样它无法捕获它。