运行时:
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呢?
throw null
有趣的事实 IntelliJ IDEA 12 告诉我,我的行e instanceof NullPointerException, 将永远是错误的。这根本不是真的。
e instanceof NullPointerException
看起来它不是null被视为 a NullPointerException,而是尝试throw null 自身 的行为抛出 a NullPointerException。
null
NullPointerException
换句话说,throw检查它的参数是非空的,如果它是空的,它会抛出一个NullPointerException.
throw
JLS 14.18指定了这种行为:
如果表达式的评估正常完成,产生一个空值,则创建并抛出类 NullPointerException 的实例 V’ 而不是空值。然后 throw 语句突然完成,原因是带有值 V’ 的 throw。