尝试创建对象框架的ArrayList时遇到问题。在一个循环中,我总是创建一个ArrayList of Integers,然后使用此命令将新Frame添加到ArrayList packetList。

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


我的问题是,我总是最终得到一个带有正确数量Frames的数组,但是每个帧都是完全相同的,其中包含最后添加的Frame中的值。

我认为问题不在于文件的读取方式,因为当我将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();
    }
}


这是Frame类的代码:

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

最佳答案

这是你的问题:

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

10-07 16:10
查看更多