0
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

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

4

6 回答 6

5

Java 不会像某些语言那样隐式转换为布尔值。您必须在条件内放置一个计算结果为布尔值的表达式:

if ((s2 = null) != null) { }

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

于 2013-09-01T05:54:18.870 回答
0

除了其他人所说的之外, s2永远不会为空 - 你只是为它分配了一个新的字符串!您确定您没有将其他语言的字符串长度/存在测试混为一谈吗?

于 2013-09-01T08:46:20.497 回答
0

通过首先评估表达式来执行 if-then 语句。

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

14.9.1. if-then 语句

通过首先评估表达式来执行 if-then 语句。如果结果是布尔类型,则需要进行拆箱转换(第 5.1.8 节)。

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

否则,通过根据结果值进行选择来继续执行:

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

如果该值为 false,则不采取进一步行动,并且 if-then 语句正常完成。

于 2013-09-01T06:05:22.537 回答
0

你应该这样做:

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

您收到此错误的原因是您必须explicitly将代码boolean evaluation放入条件为Java doesn't implicitly cast it boolean.

于 2013-09-01T06:00:28.073 回答
0

您应该注意到,在 java 中只有两个布尔值:truefalse其他一些语言不同,它使用0false 和其他任何东西作为 true。

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

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

在,

if(s2=null)

s2=null不会评估为任何布尔值,即真或假,因此编译器错误:

required: boolean
  found:    String
于 2013-09-01T06:13:20.320 回答
0

if条件仅评估布尔条件。

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

这就是获得异常的原因。

如果你使用if ((s2 = null) != null)而不是if(s2=null)它会工作。

于 2013-09-01T07:45:03.067 回答