今天我遇到了一个意外的错误,涉及 Java 1.4 中的三元条件运算符。
以下代码未产生预期结果:
product.setValue((finalAmount == 0) ? StringUtils.EMPTY : ConversionUtil.bigDecimalToString(value) + " " + code);
product.setNumber((finalAmount == 0) ? StringUtils.EMPTY : ConversionUtil.formatLongToAmountString(new Long(finalAmount)));
当 finalAmount == 0
时,Value
设置为 BlahBlahStuff,而不是 ""
。但是,数字设置正确。
但是,这有效:
if (finalAmount == 0) {
product.setValue(StringUtils.EMPTY);
product.setNumber(StringUtils.EMPTY);
}
else {
product.setValue(ConversionUtil.bigDecimalToString(value) + " " + code);
product.setNumber(ConversionUtil.formatLongToAmountString(new Long(finalAmount)));
}
为什么测试可以在一条线上进行,而不能在另一条线上进行?
finalAmount
是一个原始的 long
,并且是该方法的本地变量。
免责声明 - 我知道:
- 2013 年使用 Java 1.4 是异端邪说。遗憾的是,我不做主。
- 工作解决方案尽管不太紧凑,但实际上更高效,因为测试不会重复两次。我只是想了解为什么第一个不起作用。
最佳答案
问题在于操作顺序。首先计算三元运算符,然后将串联应用于三元运算符表达式的结果。试试这个(在字符串连接表达式两边加上括号):
product.setValue((finalAmount == 0) ? StringUtils.EMPTY : (ConversionUtil.bigDecimalToString(value) + " " + code));
关于java - Java 1.4 中三元条件运算符的意外副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140646/