为了账号安全,请及时绑定邮箱和手机立即绑定

返回NULL作为三元运算符允许的int,但不允许if语句

返回NULL作为三元运算符允许的int,但不允许if语句

GCT1015 2019-07-19 18:31:03
返回NULL作为三元运算符允许的int,但不允许if语句让我们看一下以下代码片段中的简单Java代码:public class Main {     private int temp() {         return true ? null : 0;         // No compiler error - the compiler allows a return value of null         // in a method signature that returns an int.     }     private int same() {         if (true) {             return null;             // The same is not possible with if,             // and causes a compile-time error - incompatible types.         } else {             return 0;         }     }     public static void main(String[] args) {         Main m = new Main();         System.out.println(m.temp());         System.out.println(m.same());     }}在最简单的Java代码中,temp()方法不会发出编译器错误,即使函数的返回类型为int,我们正在尝试返回值。null(通过声明return true ? null : 0;)。在编译时,这显然会导致运行时异常。NullPointerException.但是,如果我们用if语句(如same()方法),其中是吗?发出编译时错误!为什么?
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

实际上,这一切都是在Java语言规范.

条件表达式的类型确定如下:

  • 如果第二个和第三个操作数具有相同的类型(这可能是空类型),那么这就是条件表达式的类型。

因此,您(true ? null : 0)获取int类型,然后自动装箱到Integer。

尝试像这样的东西来验证这一点(true ? null : null)就会得到编译器错误。


查看完整回答
反对 回复 2019-07-19
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

编译器解释null作为对Integer,为条件运算符应用自动装箱/取消装箱规则(如Java语言规范,15.25),并愉快地向前移动。这将生成一个NullPointerException在运行时,您可以通过尝试来确认。


查看完整回答
反对 回复 2019-07-19
?
Helenr

TA贡献1780条经验 获得超4个赞

我认为,Java编译器解释true ? null : 0作为Integer表达式,该表达式可以隐式转换为int,可能会给予NullPointerException.

对于第二种情况,表达式null是特别的空型 看见,所以密码return null造成类型错配。


查看完整回答
反对 回复 2019-07-19
  • 3 回答
  • 0 关注
  • 737 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号