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

鉴于以下代码:


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 中引入的?


一只萌萌小番薯
浏览 146回答 3
3回答

精慕HU

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

沧海一幻觉

这不会编译,因为我们不能将空值分配给原始类型的变量boolean e = null;这也没有编译,虽然有判断,但是编译器检测到该值始终为null并且与前面的情况相同boolean f = c ? null : null;在这种情况下,由于编译器不知道 b 的最终值,因此代码可以编译,但由于最终值为 null 而无法运行boolean c = true;boolean d = true;boolean b = c ? null : d;

神不在的星期二

三元表达式中的类型必须是相同的 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java