当前位置: 首页 > 知识库问答 >
问题:

布尔运算、条件运算符和自动装箱

彭高畅
2023-03-14
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
}

共有1个答案

姜煌
2023-03-14

不同之处在于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个操作数的类型分别为booleanboolean,因此此子句适用:

    对于E2,第2个和第3个操作数的类型是 (而不是E1中的boolean)和boolean,所以不适用特定的类型子句(去读它们!),所以最后一个“否则”子句适用:

    否则,第二和第三操作数分别为类型S1和S2。设T1是对S1应用装箱转换后得到的类型,设T2是对S2应用装箱转换后得到的类型。条件表达式的类型是将捕获转换(§5.1.10)应用到lub(T1,T2)(§15.12.2.7)的结果。

    • S1== (参见§4.1)
    • S2==布尔
    • T1==方框(S1)==<特殊空类型>(请参见§5.1.7中装箱转换列表中的最后一项)
    • T2==方框(S2)==`Boolean
    • lub(T1,T2)==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。此三元运算符要求返回一个