Java 使用操作员打印对账单?:导致意外输出
我必须根据布尔状态创建一个输出,如Java 使用操作员打印对账单?:导致意外输出,java,operators,Java,Operators,我必须根据布尔状态创建一个输出,如 String smily = null; StringBuffer buff = new StringBuffer(); buff.append(", " + smily == null ? ":)" : ":("); //$NON-NLS-1$ System.out.println(buff.toString()); 问题是字符串创建语句 ", " + smily == null ? ":)" : ":(" 我在两个不同的eclip
String smily = null;
StringBuffer buff = new StringBuffer();
buff.append(", " + smily == null ? ":)" : ":("); //$NON-NLS-1$
System.out.println(buff.toString());
问题是字符串创建语句
", " + smily == null ? ":)" : ":("
我在两个不同的eclipse环境中测试了它(也可能是两个不同的java版本,我没有检查),结果不同
结果1:
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());
}
}
:(
结果2:
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());
}
}
错误:(
当然,如果我加上括号,它是有效的
buff.append(", " + (smily == null ? ":)" : ":(")); //$NON-NLS-1$
预期结果:
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());
}
}
,:)
有人能给我解释一下,为什么java会这样解释这个语句吗?
感谢表达式,“+smily==null?”:):”:(“
的计算结果为(“,+smily==null?”:):”:(“
这解释了你的结果1。老实说,我不知道为什么结果2是可能的。StringBuffer.append()
接受一个String
参数。所以当你把它放在没有括号的地方
String smily = null;
StringBuffer buff = new StringBuffer();
if(smily == null){
buff.append(", " + ":)") ; //$NON-NLS-1$
}else{
buff.append(", " + ":(") ; //$NON-NLS-1$
}
buff.append(", " + smily == null ? ":)" : ":(")
在求值时将是,“+null
。因此,当求值发生时,它始终为false
至于同一代码返回两个结果的原因,我只能假设使用了两个不同的Java版本,并且它们对这种情况的处理方式不同。如果您检查运算符优先级(请参阅),那么您会注意到加法(
+
)位于相等(=
)之前。换句话说,Java将首先计算,”+smily
=>”,null“
在求值相等之前,因此,”,“+smily==null
求值为false,因此三元运算符求值为:(“)
顺便说一句:在将字符串添加到StringBuffer
之前,您可以通过不连接字符串来避免这种情况(StringBuffer的全部目的是降低连接成本):
试试这个……。
buff.append(“,”+smily==null?”:):“:”:(”;
-在上述声明中,您没有提及smily==null?”:)“:”:(“
必须以正确的方式进行计算
-要解决这个问题,您必须使用BODMAS规则,下面的总是按照从左到右列出的方式进行计算。
括号
Power
除法和乘法
加法和减法
-使用括号括起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());
}
}
输出:
,:)
他不是在寻找解决办法,但是一个解释请有人给我解释一下。
提到你的eclipse jdk版本时,几乎忘了,StringBuffer是否定的,除非你有很强的理由,另一方面StringBuilder是肯定的…Smily仍然是空的,但实际的比较将是(“,“+smily)==null
或”,null“==null
啊,我想说的话的措辞很糟糕……编辑。