为什么“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