小编典典

为什么我可以在 Java 中抛出 null?

all

运行时:

public class WhatTheShoot {

    public static void main(String args[]){
        try {
            throw null;
        } catch (Exception e){
            System.out.println(e instanceof NullPointerException);
            System.out.println(e instanceof FileNotFoundException);
        }
    }
}

回应是:

true  
false

这对我来说相当惊人。我原以为这会产生编译时错误。

为什么我可以在 Java 中抛出 null,为什么它会将它向上转换为 NullPointerException?

(实际上,我不知道这是否是“向上转型”,因为我抛出了 null)

除了一个非常愚蠢的面试问题(请不要在面试中问这个),我看不出有任何理由throw null。也许你想被解雇,但那是......我的意思是,为什么会有人throw null呢?

有趣的事实 IntelliJ IDEA 12
告诉我,我的行e instanceof NullPointerException, 将永远是错误的。这根本不是真的。


阅读 93

收藏
2022-04-14

共1个答案

小编典典

看起来它不是null被视为 a NullPointerException,而是尝试throw null 自身 的行为抛出 a
NullPointerException

换句话说,throw检查它的参数是非空的,如果它是空的,它会抛出一个NullPointerException.

JLS
14.18指定了这种行为:

如果表达式的评估正常完成,产生一个空值,则创建并抛出类 NullPointerException 的实例 V’ 而不是空值。然后 throw
语句突然完成,原因是带有值 V’ 的 throw。

2022-04-14