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

2022-09-01 06:40:25
class ThrowNull {
    public static void main(String[] args) {
        throw null;
    }
}

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

简单类型(如 int 或 char)以及非可抛出类(如字符串和对象)不能用作异常。 是一个特殊的 Java 文本,表示空值。null

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


答案 1

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

throw Expression

如果计算结果为 ,则抛出 a。具体说来ExpressionnullNullPointerException

如果表达式的计算正常完成并生成一个值,则创建并抛出类的实例 V' 而不是 。nullNullPointerExceptionnull

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


答案 2

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

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

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)