自第二次方法调用以来,对象为null

时间:2019-04-17 12:38:12

标签: java android reference variable-assignment

使用以下代码,脚本仅在方法的第一次调用时才进入if (mySet! = null)块。

为什么自第二次通话mySet以来的结果是null

Map<Integer, Set<String, String>> mMap;

// ... code to populate the map with correct elements

public String myMethod(int idName)
{
    String html = "";

    Set<String> mySet = mMap.get(idName);
    // Set<String> mySet = new HashSet<>(mMap.get(idName));
    if(mySet != null)
    {
        // the script enters here only at first call?!?!?

        for(String name : mySet)
        {
            html += ", " + name;
        }
        mySet.clear();
    }

    return html;
}

myMethod(1); // return some html
myMethod(1); // return empty html...

如果我替换此行:

Set<String> mySet = mMap.get(idName);

有这行:

Set<String> mySet = new HashSet<>(mMap.get(idName));

它在每次通话时都有效。

map元素已正确设置,每次调用都不会更改活动,也不会旋转设备并且不执行其他可能的操作。

3 个答案:

答案 0 :(得分:1)

这里:

Set<String> mySet = new HashSet<>(mMap.get(idName));

创建一个新集合,该集合是您地图中内容的副本。如果直接在存储在地图中的设置对象上工作,则也将更新“地图”内容。

这就是全部:修改“根”数据映射与更新该数据的副本之间的区别。

答案 1 :(得分:1)

因为Set是Reference类型的对象,所以第一次它与条件匹配时才清除该集合,所以现在该集合为空,因此与1对应的值变为[]空集。 假设myMap具有价值:    1, ["1", "2", "3"]

现在,当您第一次执行myMethod(1)时,它将清除与1的值相对应的集合

现在,地图值变为:    1, []

因此它再次满足您的条件if(mySet != null),但是由于集合html为空,因此它没有向mySet变量添加任何内容。因此,它将返回空的html变量。

答案 2 :(得分:0)

我认为您可以通过将mymap.get(idName)克隆为myset来解决此问题

${StrContains} $0 "temp" $INSTDIR