我只是好奇。我想知道表达式
的具体原因var &= expr
与
的行为方式不同var = var && expr.
看起来第一个中的表达式正在被执行,而不管var上的错误值
我正在使用Java 6,仅供参考。这段代码:
public class Test
{
protected static String getString()
{
return null;
}
public static void main(String... args)
{
String string = getString();
boolean test = (string != null);
test = test && (string.length() > 0);
System.out.println("First test passed");
test &= (string.length() > 0);
System.out.println("Second test passed");
}
}
给我:
First test passed
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
答案 0 :(得分:10)
&
表现不像&&
1,2
&
是渴望按位/布尔 - 和。
&&
是short-circuiting逻辑 - 和。
1 &=
行相当于test = test & (string.length() > 0)
,这也会失败。
2 请参阅Why do we usually use `||` not `|`, what is the difference? - 答案还包括使用&&
和&
。
答案 1 :(得分:3)
看起来第一个中的表达式正在被执行,而不管var上的错误值
那是因为第二个表达式使用短路评估,而第一个表达式没有。
答案 2 :(得分:2)
它们不一样,因为&
是一个按位运算符,&&
是布尔值的逻辑运算符。
var &= expr
相当于var = var & expr
,而不是var = var && expr
。
答案 3 :(得分:0)
在你的情况下
test = test && (string.length() > 0); // test = false that why strings.length not evaluated
test &= (string.length() > 0); //calling length on null object that why NPE
答案 4 :(得分:-1)
&
是按位AND
&&
是合乎逻辑的AND。
true && true = true
..
&
适用于数字,&&
适用于布尔表达式。
0xFE & 0xFF
会产生0xFE
。
答案 5 :(得分:-1)
var &= expr
相当于
var = var & expr
换句话说,它执行按位或
var = var && expr
执行逻辑或var和expr