2013-03-15 3 views
0
System.out.println(symbol_b.symbolName + " " + symbol_b.pointsTo.size()); 

    // change the fieldpointsTo set of all above symbols 
    for (int i = 0; i < samePointsTo.size(); i++) 
    { 
     for (int j = 0; j < samePointsTo.elementAt(i).size(); j++) 
     { 
      Symbol symbol = samePointsTo.elementAt(i).elementAt(j); 
      System.out.println(symbol.symbolName); 

      // if field information is already present 
      if (symbol.fieldPointsTo.containsKey(fieldObj)) 
      { 
       symbol.fieldPointsTo.get(fieldObj).clear(); 
       symbol.fieldPointsTo.get(fieldObj).addAll(symbol_b.pointsTo); 
      } 
      else 
      { 
       // we have to create field information 
       symbol.fieldPointsTo.put(fieldObj, symbol_b.pointsTo); 
      } 
     } 
    } 

    System.out.println(symbol_b.symbolName + " " + symbol_b.pointsTo.size()); 

Перед для петли размером symbol_b.pointsTo является , но только после для цикла его значение изменяется от 2 до 0. Как это происходит, кто-нибудь может мне сказать. Я ничего не делаю для symbol_b.pointsTo и symbol_b.pointsTo является ветором.Unknown поведение Java программы

+2

Каковы объявленные и/или типы времени выполнения этих переменных? –

+0

fieldPointsTo является hashTable, pointsTo является вектором и символом symbol_a, symbol_b имеет тип Symbol, который является определяемым пользователем классом – neel

ответ

3

Возможно, pointTo ссылается не только на это имя переменной, но также является значением, возвращаемым symbol.fieldPointsTo.get (fieldObj), так что, когда вы вызываете .clear(), он удаляет все элементы вектора ?

+1

. Я думаю, что это наиболее вероятное объяснение (+1) – NPE

1

Может быть так, что:

if (symbol.fieldPointsTo.containsKey(fieldObj)) 
{ 
    symbol.fieldPointsTo.get(fieldObj).clear(); 
    symbol.fieldPointsTo.get(fieldObj).addAll(symbol_b.pointsTo); 
} 

Символом переменная указывает на symbol_b, symbol_b не в fieldPointsTo так она называет clear() на нем?