我必须根据布尔状态(如
)创建输出 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会这样解释声明?
由于
答案 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());
}
}
输出: , :)