4

我只是好奇。我想知道表达式是否有特定原因

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)
4

6 回答 6

10

&不像&&1,2

&是一个急切的按位/布尔值与。

&&短路逻辑与。


1带有 的行&=等同于test = test & (string.length() > 0),它也会失败。

2看看为什么我们通常使用`||`而不是`|`,有什么区别?- 答案还包括 和 的&&使用&

于 2013-03-08T22:39:36.907 回答
3

看起来第一个表达式中的表达式正在执行,而不管 var 上的错误值如何。

这是因为第二个表达式使用短路评估,而第一个表达式没有。

于 2013-03-08T22:39:41.653 回答
2

它们不一样,因为&是位运算符并且&&是布尔值的逻辑运算符。

var &= expr等于var = var & expr,不是var = var && expr

于 2013-03-08T22:39:21.323 回答
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
于 2013-03-08T22:45:17.460 回答
-1

&是按位与

&&是逻辑与。

true && true = true..

&适用于数字,&&适用于布尔表达式。

0xFE & 0xFF结果0xFE

于 2013-03-08T22:40:56.530 回答
-1
var &= expr

相当于

var = var & expr

换句话说,它按位

var = var && expr

对 var 和 expr 进行逻辑或

于 2013-03-08T22:41:16.803 回答