Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用操作员打印对账单?:导致意外输出_Java_Operators - Fatal编程技术网

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
啊,我想说的话的措辞很糟糕……编辑。