分配操作Java

分配操作Java,java,Java,我所期望的是 a) s2将被设置为null,因为它是一个赋值操作,因为我没有使用它== b) 我将在运行时在第1行得到一个NPE 相反,我得到如下输出,如下所示 输出为 class string1 { static public void main(String[] ar) { String s1 = "test"; String s2 = new String(); if(s2=null) { // line 0

我所期望的是

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

b) 我将在运行时在第1行得到一个NPE

相反,我得到如下输出,如下所示

输出为

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
        }
    }
}

有人能解释我为什么会出现编译错误吗?

Java不会像某些语言那样隐式转换为布尔值。必须将计算结果为布尔值的表达式放入条件表达式中:

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

这种情况当然没有意义,但它与您正在尝试的操作是等效的。值得注意的是,赋值很少应该在一个条件下进行。

Java不会像某些语言那样隐式转换为布尔值。必须将计算结果为布尔值的表达式放入条件表达式中:

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

这种情况当然没有意义,但它与您正在尝试的操作是等效的。值得注意的是,作业很少应该在特定条件下完成。

您应该这样做:

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

之所以出现此错误,是因为您必须将
布尔求值的代码显式地
置于
条件下,因为
Java不会隐式地将其转换为布尔值
您应该这样做:

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

之所以出现此错误,是因为必须将
布尔求值的代码显式地
放入条件中,因为
Java不会隐式地将其转换为布尔值

通过首先计算表达式来执行if-then语句

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

14.9.1。if-then语句


if-then语句通过首先计算表达式来执行。 如果结果为布尔类型,则需要取消装箱 转换(§5.1.8)

如果计算表达式或随后的取消装箱转换 (如果有)由于某种原因突然完成,if-then语句 出于同样的原因突然完成

否则,执行将根据 结果值:

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

如果该值为false,则不采取进一步的操作,If-then语句正常完成


if-then语句通过首先计算表达式来执行

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

14.9.1。if-then语句


if-then语句通过首先计算表达式来执行。 如果结果为布尔类型,则需要取消装箱 转换(§5.1.8)

如果计算表达式或随后的取消装箱转换 (如果有)由于某种原因突然完成,if-then语句 出于同样的原因突然完成

否则,执行将根据 结果值:

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

如果该值为false,则不采取进一步的操作,If-then语句正常完成


您应该注意到,java中只有两个布尔值:
true
false
,这与其他一些语言不同,这些语言使用
0
作为false,其他任何值都作为true

有人能解释我为什么会出现编译错误吗

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

在,

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

if(s2=null)

您应该注意到,java中只有两个布尔值:
true
false
,这与其他一些语言不同,这些语言使用
0
作为false,其他任何值都作为true

有人能解释我为什么会出现编译错误吗

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

在,

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

if(s2=null)

if
条件仅计算布尔条件

赋值运算符在这里不给出布尔结果

这就是得到异常的原因


如果使用
If((s2=null)!=null)
而不是
If(s2=null)
它将起作用。

如果
If
条件只计算布尔条件

赋值运算符在这里不给出布尔结果

这就是得到异常的原因


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

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

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

虽然我已经提到了jls对你的问题的解决方案,但要了解更多细节,请阅读jls的14.9.1节,这将有助于更好地理解。嗯,这是一个奇怪的问题。为什么不在if语句之前将s2值默认为null?虽然我已经提到了jls对您的问题的解决方案,但要了解更多详细信息,请阅读jls的14.9.1节,这将有助于更好地理解。嗯,这是一个奇怪的问题。为什么不在if语句之前将s2值默认为null?