为什么我可以在Java中抛出null?[副本]

运行此操作时:

公共类播放什么{
公共静态void main(字符串参数[]){
试一试{
抛出空值;
}捕获(例外e){
System.out.println(NullPointerException的e实例);
System.out.println(FileNotFoundException的e实例);
}
}
}

答复是:

true
错误的

这对我来说是相当惊人的。我本以为这会导致编译时错误

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

(事实上,我不知道这是否是一个“向上投射”,因为我抛出空值)

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

有趣的事实IntelliJ IDEA12告诉我,我的行,e instanceof NullPointerException,将始终为false。这根本不是真的

看起来并不是null被视为NullPointerException,而是试图抛出null本身抛出一个NullPointerException

换句话说,throw检查其参数是否为非null,如果为null,则抛出NullPointerException

JLS 14.18指定此行为:

如果表达式的求值正常完成,生成一个null值,那么将创建并抛出类NullPointerException的实例V’,而不是null。然后,throw语句突然完成,原因是值为V’的抛出

发表评论