2014-01-28 3 views
-12

У меня есть класс с именем SNMPv3, как показано ниже. Когда я пытаюсь вызвать функцию mergeParameters() из экземпляра этого класса, возникают некоторые странные вещи.Я нашел ошибку в отладчике IDEA

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)); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Во время компиляции, когда компилятор приходит в эту линию, когда «строка» и «это» показывает тот же самый объект

if(!row.equals(this)) 

он должен перейти к следующей итерации, но это не так. Странно идет по этой линии:

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

Я не понял почему? Btw Я уже проверил фигурные скобки.

Затем я попытался добавить еще, чтобы этот странный, если:

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?"); 
       } 
      } 
     } 
    } 
} 

Тогда это работает вполне нормально. Может кто-нибудь объяснить, почему, черт возьми, это происходит?

+12

Довольно смелое заявление для заголовка. Вместо этого вы должны использовать заголовок для описания проблемы. – Sundeep

+4

«Во время компиляции, когда компилятор входит в эту строку, когда« строка »и« это »показывает тот же объект» - во время компиляции строка 'row' не имеет значения; это просто переменная. Из-за этого ваш вопрос трудно понять. Не могли бы вы опубликовать краткую, но полную программу, демонстрирующую проблему? (Избавьтесь от чего-то неактуального и убедитесь, что мы можем его компилировать и запускать без него.) –

+2

Это очень грязный код для отладки. Можете ли вы представить меньший пример, демонстрирующий эту так называемую ошибку? –

ответ

3

Я думаю, что дело с этой линией:

if (!row.equals(this)) 

Это вы сравниваете два объекта, которые не реализовали равно метод, это может вызвать некоторое странное поведение.

Метод переопределения equals от java.lang.Object для указания, когда два «SNMPv3» равны equal.

+0

Первый URL-адрес для меня 404 –

Смежные вопросы