0

我必须根据布尔状态创建一个输出,例如

  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会这样解释语句?

谢谢

4

5 回答 5

4

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

顺便说一句:您可以通过在将字符串添加到之前不连接字符串来避免这种情况StringBuffer(StringBuffer 的全部目的是使连接更便宜):

String smily = null;
StringBuffer buff = new StringBuffer();
buff.append(", ");
buff.append(smily == null ? ":)" : ":(");
于 2012-12-12T09:12:56.220 回答
3

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

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

于 2012-12-12T08:54:22.337 回答
1

StringBuffer.append()接受一个String参数。所以当你把它不带括号

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

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

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

于 2012-12-12T08:59:44.810 回答
0
String smily = null;
StringBuffer buff = new StringBuffer();

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

}
于 2012-12-12T08:58:18.310 回答
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());
    }

}

输出: , :)

于 2012-12-12T09:26:15.583 回答