分配操作Java

时间:2013-09-01 05:52:50

标签: java

class string1 {
    static public void main(String[] ar) {
        String s1 = "test";
        String s2 = new String();
        if(s2=null) { // line 0
            System.out.println(s1);
            System.out.println(s2.length()); //Line 1
        }
    }
}

我期望发生的是

a)s2将被设置为null,因为它是一个赋值操作,因为我没有使用==

b)我将在运行期间在第1行获得NPE

而我获得了以下输出,如下所示。

输出

if(s2=null)
     ^
  required: boolean
  found:    String
1 error

有人可以解释为什么我会收到编译错误吗?

6 个答案:

答案 0 :(得分:5)

Java不会像某些语言那样隐式地转换为布尔值。您必须在Condition:

中放置一个计算结果为布尔值的表达式
if ((s2 = null) != null) { }

这种情况当然没有意义,但它相当于你试图做的事情。值得注意的是,在一个条件下很少完成作业。

答案 1 :(得分:0)

你应该这样做:

if( (s2 = null) != null)
{
  // do stuff
}

您收到此错误的原因是因为您必须explicitlyboolean evaluation的代码放在条件Java doesn't implicitly cast it boolean中。

答案 2 :(得分:0)

首先评估Expression,执行if-then语句。

来自,JLS - 第14章:块和语句

  

14.9.1。 if-then语句

     

首先评估Expression,执行if-then语句。   如果结果是布尔类型,则取消装箱   转换(第5.1.8节)。

     

如果评估表达式或后续的拆箱转换   (如果有的话)由于某种原因突然完成,if-then语句   因同样的原因突然完成。

     

否则,继续执行基于的选择   结果价值:

     

如果值为true,则执行包含的Statement;该   当且仅当执行时,if-then语句才正常完成   声明正常完成。

     

如果值为false,则不执行进一步操作,if-then语句正常完成。

答案 3 :(得分:0)

你应该注意到这样一个事实:在java中只有两个布尔值:truefalse,而不像其他语言使用0作为false而其他任何语言都是true。

  

有人可以解释为什么我会收到编译错误吗?

在if语句中,条件可以是true或false,由比较操作和布尔变量返回。

在,

if(s2=null)

s2=null不计算任何布尔值,即true或false因此编译器错误:

required: boolean
  found:    String

答案 4 :(得分:0)

if条件仅计算布尔条件。

赋值运算符在这里没有给出布尔结果。

这就是获得例外的原因。

如果您使用if ((s2 = null) != null)代替if(s2=null),则可以使用。

答案 5 :(得分:0)

除了其他人说的话,s2 永远不会为空 - 你刚给它分配了一个新的字符串!你确定你没有将字符串长度/存在测试与其他语言混淆吗?