【问题标题】:I found an Error at IDEA's debugger我在 IDEA 的调试器中发现了一个错误
【发布时间】:2014-02-19 22:33:47
【问题描述】:

我有一个名为 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));

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

然后我尝试在那个奇怪的 if 中添加一个 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?");
                }
            }
        }
    }
}

然后它工作很正常。有人能解释一下为什么会发生这种情况吗?

【问题讨论】:

  • 标题的相当大胆的声明。您应该使用标题来描述问题
  • "在编译时,当 'row' 和 'this' 显示相同的对象时,编译器进入这一行" - 在编译时,row 没有值;它只是一个变量。因此,您的问题很难理解。你能发布一个简短但完整的程序来演示这个问题吗? (去掉任何不相关的东西,并确保我们可以编译和运行它而无需其他任何东西。)
  • 那是一大堆杂乱的代码供我们调试。你能提供一个更小的例子来展示这个所谓的错误吗?
  • 你可能还没有为你的类实现 equals() 方法,所以使用了 Object 的方法。仅当两者都是相同的引用时才返回 true。如果不知道如何调用 mergeParameters(以及调用什么),我们无法确定。
  • 附带说明:在您自己的代码中几乎总是一个愚蠢的错误。很多时候,一些 3rd 方库中的错误。不是很常见,标准库中的错误。很少,编译器中的错误。非常罕见,运行时系统中的错误。顺便问一下,你的 equals() 方法是什么?

标签: java intellij-idea


【解决方案1】:

我认为处理这条线:

if (!row.equals(this))

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

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

【讨论】:

  • 我的第一个 URL 是 404
猜你喜欢
  • 2012-09-17
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
相关资源
最近更新 更多