“var& = expr”的行为不像“var = var&& expr”

时间:2013-03-08 22:37:44

标签: java compilation

我只是好奇。我想知道表达式

的具体原因
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)

6 个答案:

答案 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