Java 我在IDEA的调试器中发现一个错误

Java 我在IDEA的调试器中发现一个错误,java,intellij-idea,Java,Intellij Idea,我有一个名为SNMPv3的类,如下所示。当我试图从这个类的实例调用函数mergeParameters时,会发生一些奇怪的事情 class SNMPv3{ String[] names={"value1", "value2", "value3", "value4", "value5", "va

我有一个名为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));
                            }
                        }
                    }
                }
            }
        }
    }
}
它应该转到下一个循环,但它没有。奇怪的是,它是这样的:

 this.map.put(parametername,this.map.get(parametername) + rowinside.map.get(parametername));
if (!row.equals(this))
我不明白为什么?顺便说一句,我已经检查了花括号

然后,我尝试在这个奇怪的问题上添加一个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?");
                }
            }
        }
    }
}

那么它工作起来就很正常了。有人能解释一下这到底是为什么吗?

我认为这句话的意思是:

 this.map.put(parametername,this.map.get(parametername) + rowinside.map.get(parametername));
if (!row.equals(this))
如果您正在比较两个尚未实现equals方法的对象,这可能会导致一些奇怪的行为


Override方法等于from,用于指定两个SNMPv3何时被替换。

标题的粗体语句。当“row”和“this”显示相同的对象时,编译器进入这一行时,您应该使用标题来描述问题,而不是在编译时描述问题——在编译时,row没有值;这只是一个变量。因此,你的问题很难理解。你能发布一个简短但完整的程序来演示这个问题吗?去掉任何不相关的东西,确保我们可以编译并运行它,而不需要其他任何东西。这对我们来说是一大堆需要调试的混乱代码。你能提供一个小的例子来展示这个所谓的bug吗?你可能还没有为你的类实现equals方法,所以使用了of Object。如果两者都是相同的引用,则只返回true。如果不知道mergeParameters是如何调用的,以及使用什么,我们就无法确定。顺便说一句:在您自己的代码中,它几乎总是一个愚蠢的bug。在某些第三方库中经常出现bug。不是很常见,标准库中有一个bug。编译器中很少出现bug。非常罕见,运行时系统中有一个bug。顺便问一下,你的equals方法是什么?我的第一个URL是404