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

三元表达式可以在没有编译器错误的情况下产生空布尔值吗?

三元表达式可以在没有编译器错误的情况下产生空布尔值吗?

一只萌萌小番薯 2021-09-12 15:41:40
鉴于以下代码:boolean c = true;boolean d = true;boolean b = c ? null : d;System.out.println(b);为什么编译器不在这里抱怨?变量 b 是原始数据类型,null 不应该产生诸如“类型不匹配:无法从 null 转换为布尔值”之类的错误消息吗?我最好的猜测是,正在进行一些自动装箱?我在一个项目中看到了这段代码,但我很想知道这背后的确切原因......EDIT1:正如下面提到的 Mena,这段代码在运行时产生一个 NullPointer编辑 2:下面的形式也编译没有错误:boolean c = false;boolean d = true;boolean b = c ? null : d;System.out.println(b);编辑 3:尝试使用编译器级别 1.4 进行编译时,这不会编译,但会产生错误:Incompatible conditional operand types null and boolean.所以自动装箱是有意义的,因为它是在 1.5 中引入的?
查看完整描述

3 回答

?
精慕HU

TA贡献1845条经验 获得超8个赞

RHS 上的表达式属于类型Boolean,将在运行时自动拆箱;编译时类型检查不会受到影响。拆箱将导致运行时异常。


查看完整回答
反对 回复 2021-09-12
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

这不会编译,因为我们不能将空值分配给原始类型的变量


boolean e = null;

这也没有编译,虽然有判断,但是编译器检测到该值始终为null并且与前面的情况相同


boolean f = c ? null : null;

在这种情况下,由于编译器不知道 b 的最终值,因此代码可以编译,但由于最终值为 null 而无法运行


boolean c = true;

boolean d = true;

boolean b = c ? null : d;


查看完整回答
反对 回复 2021-09-12
?
神不在的星期二

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

三元表达式中的类型必须是相同的 type,所以我猜JLS 说在这种情况下这些类型是自动装箱的(它会变成Boolean);考虑到检查/优化javac做的很少,这里没有做。有趣的是,intellij 确实会抱怨,例如会抛出一个潜力 NullPointerException。


对我来说,这在某种程度上属于同一类别:


String s = null;


if (true == true) {


}


if(s == null) {


}

等等......它们在编译时对我们来说都是已知的,但对于编译器来说却不是。


有点不相关,但三元运算符远非if statement,Holger 曾经向我展示了这个很棒的促销示例:


boolean b = true;

Object result = b ? Integer.valueOf(42) : Long.valueOf(12);

System.out.println(result.getClass() + "  " + result); // class java.lang.Long  42


查看完整回答
反对 回复 2021-09-12
  • 3 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信