【发布时间】: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