修复我们代码中的错误,发现这个奇怪的函数行为不当:
private String calculate(String a, String b) {
return a == null ? "" : a + a != null && b != null ? "\n" : "" + b == null ? "" : b;
}在匆忙中,我只是添加了一些括号,让它像这样工作:
private String calculatePar(String a, String b) {
return a == null ? "" : a + (a != null && b != null ? "\n" : "") + (b == null ? "" : b);
}顺便说一句,这并不是最优雅的做法,但这两种方法实际上都是从我编写的(简化)测试用例中找到的。
现在,我对buggy的第一个功能做了一些测试,下面是我所想的:
现在最重要的问题是:这是怎么发生的?我的意思是,编译器很可能没有按照原始开发人员的意图放置自己的括号,但是结果如何获得null呢?
发布于 2014-07-18 13:48:55
这更多的是运算符优先问题,而不是级联问题。在没有括号的情况下,编译器使用算子优先表来判断计算顺序。+具有比比较更高的优先级,因此语句被计算为
return a == null
? ""
: (a + a != null && b != null)
? "\n"
: ("" + b == null)
? ""
: b;注意:我总是缩进嵌套的三值运算符语句,以帮助理解。
步骤1:
==空返回"“
步骤2:
A !=空
检查(a +a !=空&b !=空)
(a+a != null)总是为真,所以我们实际上是在测试b!= null
b!=空,
返回"\n“
步骤3:
如果b ==为空
检查("“+b == null)
"“+b(空)永远不等于空;始终为false
所以,返回b,它是null。
https://stackoverflow.com/questions/24830513
复制相似问题