public static void main(String[] args) throws Exception {
Boolean b = true ? returnsNull() : false; // NPE on this line.
System.out.println(b);
}
public static Boolean returnsNull() {
return null;
}
public static void main(String[] args) throws Exception {
Boolean b = true ? null : false;
System.out.println(b); // null
}
不同之处在于returnsnull()
方法的显式类型会在编译时影响表达式的静态类型:
E1: `true ? returnsNull() : false` - boolean (auto-unboxing 2nd operand to boolean)
E2: `true ? null : false` - Boolean (autoboxing of 3rd operand to Boolean)
参见Java语言规范,第15.25节条件运算符?:
>
对于E1,第2个和第3个操作数的类型分别为boolean
和boolean
,因此此子句适用:
对于E2,第2个和第3个操作数的类型是
(而不是E1中的boolean
)和boolean
,所以不适用特定的类型子句(去读它们!),所以最后一个“否则”子句适用:
否则,第二和第三操作数分别为类型S1和S2。设T1是对S1应用装箱转换后得到的类型,设T2是对S2应用装箱转换后得到的类型。条件表达式的类型是将捕获转换(§5.1.10)应用到lub(T1,T2)(§15.12.2.7)的结果。
(参见§4.1)布尔
<特殊空类型>
(请参见§5.1.7中装箱转换列表中的最后一项)boolean
因此,条件表达式的类型是boolean
,第3个操作数必须强制为boolean
。编译器为第3个操作数插入自动装箱代码(false
)。第2个操作数不需要像E1
中那样自动取消装箱,因此当返回null
时,不需要自动取消装箱NPE。
这个问题需要类似的类型分析:
Java条件运算符?:结果类型
问题内容: 为什么会抛出 虽然这不是 解决方案是通过替换false方式Boolean.FALSE来避免null被取消装箱-这boolean是不可能的。但这不是问题。问题是为什么?JLS中是否有任何引用可以证实这种行为,尤其是第二种情况? 问题答案: 别在于方法的显式类型returnsNull()会在编译时影响表达式的静态类型: 参见Java语言规范,第15.25节“ 条件运算符?”。: 对于E1,
概述 布尔运算符用于将表达式转为布尔值,一共包含四个运算符。 取反运算符:! 且运算符:&& 或运算符:|| 三元运算符:?: 取反运算符(!) 取反运算符是一个感叹号,用于将布尔值变为相反值,即true变成false,false变成true。 !true // false !false // true 对于非布尔值,取反运算符会将其转为布尔值。可以这样记忆,以下六个值取反后为true,其他值都
问题内容: 此方法搜索第一组单词字符(即),返回第一个匹配的组或出现故障的情况。 相同的函数可以重写为: 这是相同的,并且已记录为行为。作为此页中明确指出: 表达式首先计算; 如果为假,则返回其值;否则,将求值并返回结果值。 但是,作为布尔运算符(甚至在手册中也是如此),我希望返回一个布尔值。结果,当我发现这是如何工作时,我感到非常惊讶。 有什么其他用例,和/或这种不太直观的实现的原理是什么? 问
问题内容: 我对何时应该使用布尔运算符与按位运算符感到困惑 与 与 有人能启发我何时使用每种药物,何时使用一种药物会影响我的结果? 问题答案: 以下是一些准则: 布尔运算符通常用于布尔值,而按位运算符通常用于整数值。 布尔运算符是短路,但按位运算符不是短路。 短路行为在这样的表达式中很有用: 按位运算&符将无法正常工作,因为总是会评估双方,即。当你使用布尔运算符时,如果第一个为False,则不计算
前言 上个礼拜介绍了Shell编程范例之数值运算,对 Shell 下基本数值运算方法做了简单的介绍,这周将一起探讨布尔运算,即如何操作“真假值”。 在 Bash 里有这样的常量(实际上是两个内置命令,在这里我们姑且这么认为,后面将介绍),即 true 和 false,一个表示真,一个表示假。对它们可以进行与、或、非运算等常规的逻辑运算,在这一节,我们除了讨论这些基本逻辑运算外,还将讨论Shell编
Java 提供了一个特别的三元运算符(也叫三目运算符)经常用于取代某个类型的 if-then-else 语句。 条件运算符的符号表示为“?:”,使用该运算符时需要有三个操作数,因此称其为三目运算符。使用条件运算符的一般语法结构为: 其中,expression 是一个布尔表达式。当 expression 为真时,执行 statement1, 否则就执行 statement3。此三元运算符要求返回一个