java - Java 1.4 中三元条件运算符的意外副作用

标签 java long-integer ternary-operator java1.4

今天我遇到了一个意外的错误,涉及 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,并且是该方法的本地变量。

免责声明 - 我知道:

  1. 2013 年使用 Java 1.4 是异端邪说。遗憾的是,我不做主。
  2. 工作解决方案尽管不太紧凑,但实际上更高效,因为测试不会重复两次。我只是想了解为什么第一个不起作用。

最佳答案

问题在于操作顺序。首先计算三元运算符,然后将串联应用于三元运算符表达式的结果。试试这个(在字符串连接表达式两边加上括号):

product.setValue((finalAmount == 0) ? StringUtils.EMPTY : (ConversionUtil.bigDecimalToString(value) + " " + code));

关于java - Java 1.4 中三元条件运算符的意外副作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140646/

相关文章:

c++ - C++中长整数除法的上限

javascript - 为什么两个单独评估的 javascript 字符串表达式不能一起正确评估?

java - 忽略测试用例中的断言失败 (JUnit)

java - 如何从扫描仪获取多个输入并将数字分配给一个值?

java - (索引越界)我用java写了一个刽子手游戏程序

java - 使用 BufferedReader 从文件中读取 Long 和 String

java - 将我的 jar 导入 spark shell

c# - 长整数可以在 32 位系统上工作吗?

python - 使用三元运算符进行方法调用的伦理和可读性

javascript - 在 AngularJS 中的三元运算符中使用过滤器