我在IDEA的调试器上发现了一个错误

时间:2014-01-28 14:49:03

标签: java intellij-idea

我有一个名为SNMPv3的类,如下所示。当我尝试从这个类的实例调用函数mergeParameters()时,会发生一些奇怪的事情。

class SNMPv3{
    String[] names={"value1",
                    "value2",
                    "value3",
                    "value4",
                    "value5",
                    "value6"};
    Map<String,String> map = new HashMap<String,String>();
    void mergeParameters(ArrayList<SNMPv3> snmpv3List)
    {
        for(String parametername : this.map.keySet())
        {
            String parametervalue="";
            for(SNMPv3 row : snmpv3List)
            {
                if(!row.equals(this))
                {
                    if(parametervalue.equals(""))
                    {
                        parametervalue = row.map.get(parametername);
                    }
                    else if(parametervalue.equals(row.map.get(parametername)))
                    {
                        this.map.put(parametername, "");
                        for(SNMPv3 rowinside : snmpv3List)
                        {
                            if(!rowinside.equals(this))
                            {
                                this.map.put(parametername,this.map.get(parametername) + rowinside.map.get(parametername));
                            }
                        }
                    }
                }
            }
        }
    }
}

在编译时,当'row'和'this'显示相同的对象时编译器进入此行

if(!row.equals(this))

它应该进入下一个循环,但事实并非如此。奇怪的是它走到了这一行:

 this.map.put(parametername,this.map.get(parametername) + rowinside.map.get(parametername));

我不明白为什么?顺便说一下,我已经检查了花括号。

然后我尝试在那个奇怪的地方添加一个else:

class SNMPv3{
    String[] names={"value1",
                    "value2",
                    "value3",
                    "value4",
                    "value5",
                    "value6"};
    Map<String,String> map = new HashMap<String,String>();
    void mergeParameters(ArrayList<SNMPv3> snmpv3List)
    {
        for(String parametername : this.map.keySet())
        {
            String parametervalue="";
            for(SNMPv3 row : snmpv3List)
            {
                if(!row.equals(this))
                {
                    if(parametervalue.equals(""))
                    {
                        parametervalue = row.map.get(parametername);
                    }
                    else if(parametervalue.equals(row.map.get(parametername)))
                    {
                        this.map.put(parametername, "");
                        for(SNMPv3 rowinside : snmpv3List)
                        {
                            if(!rowinside.equals(this))
                            {
                                this.map.put(parametername,this.map.get(parametername) + rowinside.map.get(parametername));
                            }
                        }
                    }
                }
                else{
                    System.out.println("Isnt it strange?");
                }
            }
        }
    }
}

然后它很正常。有人可以解释为什么会发生这种情况吗?

1 个答案:

答案 0 :(得分:3)

我认为这条线的处理:

if (!row.equals(this))

您是在比较两个未实现equals方法的对象,这可能会导致一些奇怪的行为。

java.lang.Object覆盖方法equals以指定两个“SNMPv3”何时为equal