Java ArrayList和Map上的空指针和索引超出边界

Java ArrayList和Map上的空指针和索引超出边界,java,serialization,nullpointerexception,maps,indexoutofboundsexception,Java,Serialization,Nullpointerexception,Maps,Indexoutofboundsexception,以及此代码段中的java.lang.NullPointerException: public class DataStorage implements java.io.Serializable { private static final long serialVersionUID = -5597052819894601310L; private ArrayList<ArrayList<String>> array = new ArrayList<>(); p

以及此代码段中的java.lang.NullPointerException:

public class DataStorage implements java.io.Serializable {
private static final long serialVersionUID = -5597052819894601310L;
private ArrayList<ArrayList<String>> array = new ArrayList<>();
private Map<String, String[]> nameMap;
private int index = 0;

DataStorage() {
    array.add(index, new ArrayList<String>());
}
public void addDataToRow() {
    index += 1;
    array.add(index, new ArrayList<String>());
    array.get(index).add(new String());
}

public void addDataToColumn(int pos, String data) {
    array.get(index).add(pos, data);
}

public int rowSize() {
    return array.size();
}

public int colSize() {
    return array.get(index).size();
}

public String initNameMap() {
    nameMap = new TreeMap<>();
    String out = "";
    for(int i = 2; i < array.size(); i++) {
        String[] infoHolder = new String[40];
        String name = array.get(i).get(2);
        int index = 0;
        for(int w = 3; w < array.get(i).size(); w++) {
            System.out.println(index);
            infoHolder[index] = array.get(i).get(w);
            index++;
        }
        nameMap.put(name, infoHolder);
    }

    for(String x : nameMap.keySet()) out += x + "\n";
    return out;

}

public String navigateArray(int rStart, int cStart) {
    String out = "";
    for(int i = rStart; i < array.size(); i++) {
        for(int w = cStart; w < array.get(i).size(); w++) {
            out += array.get(i).get(w) + " ";
        }
        out += "\n";
    }
    return out;
}

}
String name = array.get(i).get(2);
我简直不明白为什么会发生这种情况。这让我非常困惑,尤其是indexoutofbounds例外。有人能给我解释一下吗?这和序列化有什么关系吗?谢谢

nameMap.put(name, infoHolder);
中的嵌套ArrayList

array.get(i).get(2);
大小为1,因此当您尝试获取第二个元素(不存在)时,您将获得OutOfBoundsException

array

结果将为空。您需要弄清楚为什么数组中嵌套的ArrayList没有预期的两个元素。

所以您序列化了此类的一个对象,更改了类,然后使用新版本反序列化了以前的版本?我没有研究过,但我不认为序列化会支持它。这就是我解释的不可能的,它的大小不应该是1。如果我在navigateArray()中运行array.get(I).get(2),它不会给出该错误,而是输出我存储的数据。我不知道它为什么会这样。很明显,在这期间数组正在被修改。您能在实例化数据存储的地方发布更多的代码吗?我对数据存储所做的唯一一件事是反序列化之前序列化的对象,然后调用initNameMap()。然后它给了我这些例外。如果调用navigateArray(),它会正确显示数据。这就是我调用它们的地方:String out=storer.navigateArray(0,storer.rowSize(),0,29);initNameMap();jTextArea1.setText(输出);那代码没有意义。您说storer.navigateArray(0,storer.rowSize(),0,29);但是navigateArray在您最初发布的代码中只有两个参数(navigateArray(int-rStart,int-cStart))对不起,我目前正在测试不同的东西,我修改了该方法,但是它是否是storer.navigateArray(0,storer.rowSize(),0,29);或storer.navigateArray(0,storer.rowSize(),0);我不认为有多大区别,是吗?如果有用的话,我就是这样反序列化的:试试{java.io.FileInputStream fis=new java.io.FileInputStream(“storer.ser”);java.io.ObjectInputStream ois=new java.io.ObjectInputStream(fis);storer=(DataStorage)ois.readObject();ois.close();}catch(IOException | ClassNotFoundException e){e.printStackTrace()}
name