Java运算符优先级与三元运算符问题:移除括号后结果不符
问题解析:运算符优先级导致的求值顺序差异
这事儿本质是Java运算符优先级在搞鬼,咱们把两段代码的执行逻辑拆开来理:
带括号的正确代码
return "Unexpected Error: " + (e.getMessage() == null ? "No further details!" : e.getMessage());
括号强制改变了求值顺序:先执行括号里的三元表达式,判断e.getMessage()是否为null,拿到对应的描述字符串后,再和前面的"Unexpected Error: "做拼接,最终返回完整的错误提示。
不带括号的错误代码
return "Unexpected Error: " + e.getMessage() == null ? "No further details!" : e.getMessage();
这里没有括号,Java会严格按照运算符优先级执行:
- 首先执行优先级最高的
+:把"Unexpected Error: "和e.getMessage()拼接成一个完整字符串(比如"Unexpected Error: Index 0 out of bounds for length 0")。 - 接着执行优先级次之的
==:把第一步得到的字符串和null做比较——显然这个字符串不可能是null,所以比较结果为false。 - 最后执行优先级最低的三元运算符
?::因为前面的比较结果是false,所以返回冒号后面的e.getMessage(),也就是直接返回了异常的原始描述,丢掉了前面的前缀。
关键优先级规则
Java里相关运算符的优先级从高到低是:
- 字符串拼接
+> 关系运算符==> 三元条件运算符?:
内容的提问来源于stack exchange,提问作者S R Samy
相关产品推荐
相关产品推荐

