【问题标题】:Java throwing Error and catching NullPointerExceptionJava 抛出错误并捕获 NullPointerException
【发布时间】:2014-12-22 10:43:00
【问题描述】:

这对我来说没有意义。

第一个例子:

示例 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 块无法捕获 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?这没有道理。

有:

可抛出:错误、异常

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

【问题讨论】:

  • 这些例子都不好。你从哪里弄来的?
  • 你确定catch (NullPointerException e) 赶上 Error吗?
  • 是的,这就是我的问题的重点:)
  • JLS 14.18: "如果表达式的评估正常完成,产生一个null 值,那么将创建并抛出类NullPointerException 的实例V' 而不是null。然后 throw 语句突然完成,原因是带有值 V' 的 throw。"
  • 这个问题似乎离题了,因为 OP 错误地描述了包含明显悖论的示例 2。

标签: java exception nullpointerexception


【解决方案1】:

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

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

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

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

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

(JLS 11.1.1.)

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

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

【讨论】:

  • 是的,我知道,但请查看最后一个示例。
  • 重点是throw 命令本身 正在抛出异常,因为您正在尝试throw null
  • 所以我抛出错误而不是异常并不重要,抛出异常?
  • @RichardK 你没有抛出错误。您尝试抛出错误失败,而是抛出 NullPointerException
  • @RichardK 因为错误不需要 try - catch,但异常需要
【解决方案2】:

有两点需要注意。

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

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

【讨论】:

    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 2012-06-06
    • 1970-01-01
    • 2011-09-07
    • 2015-10-05
    • 2021-01-31
    相关资源
    最近更新 更多