You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中println()内布尔表达式未加括号引发的异常输出问题

为什么Java中未加括号的表达式会导致意外输出?

嘿,这个问题的核心其实是Java运算符优先级在暗中影响执行顺序,完全超出你的预期很正常——毕竟AP级别的内容通常不会深入到这种细节!

让我们拆解一下你遇到的问题:

1. 未加括号时的执行逻辑

先看你最初的代码行:

System.out.println("t == s?" + t == s);

Java里,字符串拼接运算符+的优先级高于相等比较运算符==,所以这行代码的实际执行顺序是:

  1. 先执行字符串拼接:"t == s?" + t,得到新字符串 "t == s?Oh No!"
  2. 再把这个新字符串和s做==比较:"t == s?Oh No!" == "Oh No!"

虽然s和t指向常量池里的同一个字符串对象,但拼接出来的新字符串是在堆内存中创建的全新对象,和s的内存地址不一样,所以==比较的结果是false,这就是控制台第一个输出false的原因——你以为是输出拼接后的字符串加布尔值,但实际上是输出了这个比较的结果!

2. 加括号后的执行逻辑

当你给(t == s)加上括号后:

System.out.println("t == s?" + (t == s));

括号改变了执行优先级:

  1. 先执行括号里的t == s,因为s和t指向同一个常量池对象,所以得到true
  2. 再把这个布尔值和前面的字符串拼接:"t == s?" + true,最终输出"t == s?true",这就符合你的预期了。

补充小提示

记住:==在Java中比较的是对象的内存地址,而不是内容(除非是基本类型)。如果要比较字符串内容,应该用equals()方法,但这里你的问题根源还是运算符优先级,不是字符串比较的方式~

内容的提问来源于stack exchange,提问作者user9791396

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:45:36