2015-03-22 2 views
1

Я столкнулся с проблемой при попытке создать ArrayList объектов Frame. В цикле я всегда создаю ArrayList из целых чисел, а затем использую эту команду, чтобы добавить новый пакетный список Frame в ArrayList.ArrayList переписывает себя

packetList.add(new Frame(tempFrameList, size, count)); 

Моя проблема в том, что я всегда в конечном итоге с массивом с правильным количеством кадров, но каждый кадр точно так же, содержащий значения из последней добавленной рамы.

Я не думаю, что проблема в том, как файл читается, потому что когда я добавляю println в цикл, где я добавляю элементы в массив, значения верны.

Вот код, где я добавлять элементы в ArrayList:

public class OpenFile { 
     static Pcap pcap; 
     static PcapPacket packet = new PcapPacket(JMemory.POINTER); 
     static List<Frame> packetList = new ArrayList<Frame>(); 

    public void init(){ 
     final StringBuilder errbuf = new StringBuilder(); // For any error msgs 
     final String file = "trace-1.pcap"; 
     int count = 0; 
     int size; 
     List<Integer> tempFrameList; 

     pcap = Pcap.openOffline(file, errbuf); 

    while (pcap.nextEx(packet) == Pcap.NEXT_EX_OK) { 
     tempFrameList = new ArrayList<Integer>(); 
     count++; 
     size = packet.size(); 

      for (int i = 0; i < size; i++) { 
       tempFrameList.add(packet.getUByte(i)); 
      } 

      //here is my problem 
      packetList.add(new Frame(tempFrameList, size, count)); 
     } 

     pcap.close(); 
    } 
} 

Вот код из класса Рама:

public class Frame{ 
    private static List<Integer> frame = new ArrayList<Integer>(); 
    private static int size; 
    private static int serialNum; 


    public Frame(List<Integer> data, int newSize, int num) { 
     Frame.frame = data; 
     Frame.size = newSize; 
     Frame.serialNum = num; 
    } 
} 

ответ

6

Вот ваша проблема:

public class Frame{ 
    private static List<Integer> frame = new ArrayList<Integer>(); 
    private static int size; 
    private static int serialNum; 

члены Frame не должны быть статическими, так как статические члены являются общими для всех экземпляров класса. Удалите ключевое слово static.

также изменить конструктор соответственно:

public class Frame { 
    private List<Integer> frame = new ArrayList<Integer>(); 
    private int size; 
    private int serialNum; 


    public Frame(List<Integer> data, int newSize, int num) { 
     this.frame = data; 
     thus.size = newSize; 
     this.serialNum = num; 
    } 
} 
Смежные вопросы