首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"var &= expr“的行为与"var = var && expr”不同

"var &= expr“的行为与"var = var && expr”不同
EN

Stack Overflow用户
提问于 2013-03-09 06:37:44
回答 5查看 240关注 0票数 4

我只是好奇。我想知道这句话有没有特定的原因

代码语言:javascript
复制
var &= expr

的行为方式与

代码语言:javascript
复制
var = var && expr.

它看起来像是执行第一个表达式,而不管var上的值是假的。

我正在使用Java 6,仅供参考。这段代码:

代码语言:javascript
复制
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");
    }
}

给了我:

代码语言:javascript
复制
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)
EN

回答 5

Stack Overflow用户

发布于 2013-03-09 06:39:42

它看起来像是执行了第一个表达式,而不管

上的值是假的。

这是因为第二个表达式使用短路求值,而第一个表达式不使用。

票数 3
EN

Stack Overflow用户

发布于 2013-03-09 06:39:21

它们是不同的,因为&是按位运算符,而&&是布尔值上的逻辑运算符。

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

票数 2
EN

Stack Overflow用户

发布于 2013-03-09 06:45:17

在你的情况下

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15304527

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档