当前位置: 首页 > 面试题库 >

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

姚宪
2023-03-14
问题内容
class ThrowNull {
    public static void main(String[] args) {
        throw null;
    }
}

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

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

那么为什么要throw null;在此代码中进行编译?


问题答案:

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

throw Expression

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

如果对 Expression的null值正常完成并产生一个值,则将创建类的实例
V’NullPointerException并将其引发,而不是null

由于NullPointerExceptionextended
RuntimeException,它是一个未经检查的异常。这可以解释为什么此构造没有报告编译时错误。



 类似资料:
  • 问题内容: 遇到一个错误地使用 而不是 在其代码中的人,它没有显示为编译错误。 是因为 是相同的 ? 问题答案: 没有编译错误,因为它是有效的(尽管相当无用) 一元运算符 ,其使用方式与以下方式相同: Java语言规范中的相关部分是Unary Plus运算符+(第15.15.3节) 。它指定调用一元运算会导致操作数的一元数值提升(第5.6.1节)。这意味着: * 如果操作数是编译时类型的,,,或,

  • 问题内容: 如果您有这样的程序: 注意两个输出语句之间写的URL 。 为什么程序编译时没有任何错误? 问题答案: 程序编译没有错误的原因是程序将其视为标签,这在Java中是允许的,并且通常与循环一起使用。 第二部分是,是的注释,因此被编译器忽略。 因此,它可以正确编译。

  • 问题内容: 如果你给 它没有编译,但是带有花括号的相同代码是: 有什么解释? 问题答案: 基本上,变量声明只能在块中声明。 查看 Java语言规范中“语句”的语法 -它包括Block,但不包括LocalVariableDeclarationStatement- 后者是block语法的一部分。 这实际上是实用主义的问题:如果没有括号,则只能使用一个语句。如果没有后续语句,则声明变量是没有意义的,因为

  • 问题内容: 这段代码使我凝视了几分钟: (这里的第137行) 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 它不是一个keyword,而是一个label。 用法:

  • 问题内容: 几天后,我匆忙将一个URL错误地粘贴到了Java程序中,我试图运行该特定程序,并且出于好奇,它成功运行了,没有任何警告,没有错误,也没有异常。类似的代码如下所示。我编译并成功运行。 在main()方法的第二行,它应该发出一些编译时错误,但它可以很好地工作并在控制台上显示相应的消息。为什么? 问题答案: 标记被解释为标签。而随后启动一个新的行注释。因此,发布的代码仍然是有效的Java(如