为什么“throw null”不会在Java中创建编译错误?

class ThrowNull {
    public static void main(String[] args) {
        throw null;
    }
}

我们知道throw的规则是throw ThrowableInstance; 其中ThrowableInstance必须是ThrowableInstance类型的对象或Throwable的子类。

简单类型(如int或char)以及非Throwable类(如String和Object)不能用作例外。 null是表示空值的特殊Java文字。

那么为什么要throw null; 在这段代码中编译?


根据语言规范, throw语句被定义为:

throw Expression

如果Expression计算结果为null ,则抛出NullPointerException 。 特别,

如果对Expression的评估正常完成,生成一个null值,则会创建NullPointerException类的实例V'并抛出而不是null

由于NullPointerException扩展了RuntimeException ,因此它是一个未经检查的异常。 这可以解释为什么从这个结构中没有报告编译时错误。


编译器没有检查的东西有很多,它假定你做的事情有一个很好的理由,它可能不知道。 它试图防止的是开发人员犯的常见错误。

有人可能认为这是一个很好的选择

throw new NullPointerException();

Integer i = null;
try {
    i.intValue();
} catch (NullPointerException npe) {
    System.err.println("Caught NPE");
    npe.printStackTrace();
}

try {
    throw null;
} catch (NullPointerException npe) {
    System.err.println("Caught NPE");
    npe.printStackTrace();
}

在Java 6更新38中打印

Caught NPE
java.lang.NullPointerException
    at Main.main(Main.java:9)

我认为,因为Null可以投入到任何类型的引用中,所以在编译时它没有错,如果你抛出null而不是throwable。

链接地址: http://www.djcxy.com/p/73625.html

上一篇: Why is "throw null" not creating a compilation error in Java?

下一篇: difference between linkedhashmap, hashmap, map, hashtable