与运营商打印声明? :导致意外输出

时间:2012-12-12 08:53:23

标签: java operators

我必须根据布尔状态(如

)创建输出
  String smily = null;
  StringBuffer buff = new StringBuffer();
  buff.append(", " + smily == null ? ":)" : ":("); //$NON-NLS-1$

  System.out.println(buff.toString());

问题是字符串创建语句

  ", " + smily == null ? ":)" : ":("

我在2个不同的eclipse环境中测试过它(也可能是2个不同的java版本,我没有检查过),结果不同。

结果1:

  

:(

结果2:

  

假:(

当然,如果我添加括号,它正在工作

 buff.append(", " + (smily == null ? ":)" : ":(")); //$NON-NLS-1$

预期结果:

  

,:)

可以请有人向我解释,为什么java会这样解释声明?

由于

5 个答案:

答案 0 :(得分:4)

如果检查运算符优先级(请参阅this tutorial),那么您会注意到相等(+)之前的加法(==)。换句话说,Java将首先评估", " + smily =>在评估相等性之前", null",因此", " + smily == null的计算结果为false,因此三元运算符的计算结果为":("

BTW:你可以通过在将字符串添加到StringBuffer之前不连接字符串来避免这种情况(StringBuffer的整点是使连接更便宜):

String smily = null;
StringBuffer buff = new StringBuffer();
buff.append(", ");
buff.append(smily == null ? ":)" : ":(");

答案 1 :(得分:3)

表达式", " + smily == null ? ":)" : ":("评估为(", " + smily) == null ? ":)" : ":("

这解释了你的结果1.说实话,我不知道为什么结果2是可能的。

答案 2 :(得分:1)

StringBuffer.append()需要String个参数。所以当你把它放在没有括号的时候

buff.append(", " + smily == null ? ":)" : ":(")

在评估时将是", " + null。因此,当评估发生时,它总是错误的。

至于为什么相同的代码返回两个结果,我只能假设使用了两个不同的Java版本,他们处理这种情况的方式不同。

答案 3 :(得分:0)

String smily = null;
StringBuffer buff = new StringBuffer();

  if(smily == null){
    buff.append(", " +  ":)") ; //$NON-NLS-1$
     }else{
        buff.append(", " +   ":(") ; //$NON-NLS-1$

}

答案 4 :(得分:0)

试试这个.....................

buff.append(", " + smily == null ? ":)" : ":(");

- 在上面的陈述中,您不提及要以正确的方式评估smily == null ? ":)" : ":("

- 要解决此问题,您必须使用 BODMAS 规则,以下始终按照从左到右列出的方式进行评估。

Bracket

Power

Division and Multiplication

Addition and Substraction

- 使用括号括起smily == null ? ":)" : ":("

<强>例如

public class Test {

    public static void main(String[] args){

        String smily = null;
          StringBuffer buff = new StringBuffer();
          buff.append(", " + (smily == null ? ":)" : ":(")); //$NON-NLS-1$

          System.out.println(buff.toString());
    }

}

输出: , :)