为什么"throw null"没有在Java中创建编译错误?

Reu*_*ben 32 java null exception-handling

class ThrowNull {
    public static void main(String[] args) {
        throw null;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

简单类型(如int或char)以及非Throwable类(如String和Object)不能用作异常.null是一个特殊的Java文字,表示一个空值.

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

Gar*_*het 55

根据语言规范,throw声明定义为:

throw Expression
Run Code Online (Sandbox Code Playgroud)

如果Expression评估为null,则NullPointerException抛出a.特别,

如果表达式的评估正常完成,产生一个null值,则创建并抛出类的实例V'NullPointerException而不是null.

NullPointerException扩展以来RuntimeException,它是一个未经检查的例外.这可以解释为什么没有报告此构造的编译时错误.


Pet*_*rey 5

编译器没有检查很多东西,它假设你做了一些它可能不知道的好理由.它试图阻止的是开发人员常犯的错误.

有人可能认为这是一个很好的简写

throw new NullPointerException();
Run Code Online (Sandbox Code Playgroud)
Integer i = null;
try {
    i.intValue();
} catch (NullPointerException npe) {
    System.err.println("Caught NPE");
    npe.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

try {
    throw null;
} catch (NullPointerException npe) {
    System.err.println("Caught NPE");
    npe.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

用Java 6更新38打印

Caught NPE
java.lang.NullPointerException
    at Main.main(Main.java:9)
Run Code Online (Sandbox Code Playgroud)