java - 这是一个java boolean 值可以为空的场景吗?为什么这段代码会编译?

标签 java boolean conditional-operator

我们最近在生产中遇到了一个我发现非常有趣的错误。我长期以来的理解是,Java boolean 值只能是假的或真的。但是,似乎在三元运算符中它最终可以解析为 null,并且它从未产生编译错误,并且一直构建到生产中。我很惊讶以下代码不会产生编译错误。有谁知道为什么它编译得很好?恕我直言,它不应该编译!它最终解析为一个原生 boolean 值。

boolean por = (str == null || str.length() == 0) ? null : "true".equalsIgnoreCase(str);

最佳答案

Does anyone know why it compiles just fine?

最终,因为自动装箱/自动拆箱。

当编译器处理一个三元表达式时,它使用第二个和第三个操作数来选择表达式的结果类型。在您的情况下,第二个具有 null 类型,第三个具有(原始) boolean 类型。这些不是直接兼容的,但由于自动装箱,两者都与类型 Boolean 兼容。因此,表达式的结果具有类型 Boolean确实支持 null

由于自动un装箱,允许将Boolean类型的值赋给boolean类型的变量, 但是如果分配的值为 null,这将失败并返回 NullPointerException,就像您调用了 booleanValue() 方法就可以了。我认为这是您在生产中观察到的错误。

这是自动装箱的问题之一。

关于java - 这是一个java boolean 值可以为空的场景吗?为什么这段代码会编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71784682/

相关文章:

java - 为什么我的 View 没有绘制?

java - 检查 JSON 字符串中是否存在多个键 - Java

c# - 条件运算符表达式(连续几个)

c - C中奇怪的整数比较

php - 使用三元运算符和引用值的 foreach 中的意外行为

python - "or"Python 中的条件问题

java - Java 中的 native 方法、Java 中的 C、Java native 接口(interface) (JNI)

java - 计算并输出两个字符串之间的相似字符

MySQL 查询过滤包含搜索字符串中任何单词的记录

python - 我想返回 "duo"列表中顶级元素的数量