分配操作Java
我所期望的是 a) s2将被设置为null,因为它是一个赋值操作,因为我没有使用它== b) 我将在运行时在第1行得到一个NPE 相反,我得到如下输出,如下所示 输出为分配操作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
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?