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

这是一个java布尔值可以为空的场景吗?为什么要编译这段代码?

南门茂才
2023-03-14

我们最近在生产中遇到了一个我觉得非常有趣的错误。我长期以来的理解是Java布尔只能是false或true。然而,在三元运算符中,它似乎最终可以解析为null,而且它从未产生编译错误,并且一直构建到生产。我很惊讶下面的代码没有产生编译错误。有人知道为什么它编译得很好吗?恕我直言,它不应该编译!它最终解析的值是一个本机布尔值。

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

共有1个答案

袁泰平
2023-03-14

有人知道它为什么编译得很好吗?

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

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

由于自动取消装箱,允许将Boolean类型的值分配给Boolean类型的变量,但如果所分配的值为null,则这将失败,因为NullPointerException会导致此操作失败,就像您对其调用了booleanValue()方法一样。我想这就是你们在生产中观察到的错误。

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

 类似资料:
  • 在方法或类范围内,下面的行编译(带有警告): 在类作用域中,变量获取其默认值,以下给出未定义引用错误: 这难道不是第一个应该以相同的未定义引用错误结束吗?或者第二行应该编译?或者我错过了什么?

  • 问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法:

  • 问题内容: 如果你给 它没有编译,但是带有花括号的相同代码是: 有什么解释? 问题答案: 基本上,变量声明只能在块中声明。 查看 Java语言规范中“语句”的语法 -它包括Block,但不包括LocalVariableDeclarationStatement- 后者是block语法的一部分。 这实际上是实用主义的问题:如果没有括号,则只能使用一个语句。如果没有后续语句,则声明变量是没有意义的,因为

  • 问题内容: 这段代码使我凝视了几分钟: (这里的第137行) 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 它不是一个keyword,而是一个label。 用法:

  • 问题内容: 因此,我刚刚意识到反编译Java代码是多么容易。我一直在网上搜索,但似乎无法弄清楚 为什么 这么容易。每次我在Google上搜索“为什么要反编译文件?”之类的信息时,或“为什么Java这么容易反编译”,我所得到的只是指向可以轻松反编译我的代码的软件的链接。因此,我向您介绍StackOverflow:为什么Java可以转换回容易阅读的源代码,而C ++和其他语言对反编译不是很友好? 谢谢

  • 当我跑的时候 我在Java中得到错误。为什么?这相当于false==false,这是真的。这不是Java特有的,我在其他语言中也得到了相同的结果。这是因为短路评估吗?似乎左右双方仍会/应该进行比较。