Java 抛出错误并捕获 NullPointerException

标签 java exception nullpointerexception

这对我来说没有意义。

第一个例子:

示例 1(良好):

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

这段代码一切正常 - 异常被抛出并被捕获。

示例 2(错误):

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

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

如果我抛出一个错误,我该如何捕获NullPointerException?这个不成立。

有:

Throwable:错误、异常

ErrorException都是Throwable的子类,但是NullPointerException无关>错误,这是一个Exception,而不是Error

最佳答案

您正试图抛出一个空对象,但失败了,并导致抛出一个 NullPointerException

您应该使用 throw new Exception (); 抛出异常

只是为了澄清。如果您问为什么第二个示例无法编译,而第四个示例可以:

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

The unchecked exception classes are the run-time exception classes and the error classes.

( JLS 11.1.1. )

这就是为什么您可以抛出一个 Error 并捕获一个 Exception,并且代码会编译。

另一方面,在您的第二个示例中,您试图抛出一个检查异常 (Exception) 并捕获一个 NullPointerException,这不是父类(super class)异常。这就是为什么除非您捕获 Exception 或声明您的主方法 throws Exception,否则代码不会编译。

关于Java 抛出错误并捕获 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26584426/

相关文章:

java - 将 KeyListener 添加到 JToolTip

java - Android Syncronization - 表中已存在数据

java - 零和等于的对称性

java - c 代码可以引发 java 异常吗?

java - 三元运算符中不需要的 NullPointerException - 为什么?

java - 如何使用java和hibernate在Oracle中存储几何点?

java - 为什么输出字符串传递的不是对象

exception - RISC-V SYSTEM 指令如何实现为陷阱?

java - 在Java中进行SAX解析时捕获与XML无关的异常?