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
有人可以解释为什么我会收到编译错误吗?
答案 0 :(得分:5)
Java不会像某些语言那样隐式地转换为布尔值。您必须在Condition:
中放置一个计算结果为布尔值的表达式if ((s2 = null) != null) { }
这种情况当然没有意义,但它相当于你试图做的事情。值得注意的是,在一个条件下很少完成作业。
答案 1 :(得分:0)
你应该这样做:
if( (s2 = null) != null)
{
// do stuff
}
您收到此错误的原因是因为您必须explicitly
将boolean 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中只有两个布尔值:true
和false
,而不像其他语言使用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 永远不会为空 - 你刚给它分配了一个新的字符串!你确定你没有将字符串长度/存在测试与其他语言混淆吗?