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

}

これが起こっていることです。この質問に含めたクラスがあります。このクラスのオブジェクトを作成し、このクラスの ArrayList にファイルからの情報を入力してから、オブジェクトをシリアル化しました。その後、initNameMap() メソッドを追加し、TreeMap として初期化された Map を追加しました。ここで、以前にシリアル化したオブジェクトを逆シリアル化し、その中の情報を取得できますが、initNameMap() メソッドを呼び出すと、次の例外が発生します。

java.lang.IndexOutOfBoundsException: インデックス: 2、サイズ: 1 コードのこのセグメント:

String name = array.get(i).get(2);

コードのこのセグメントでの java.lang.NullPointerException:

nameMap.put(name, infoHolder);

なぜこれが起こっているのか分かりません。特にindexoutofbounds例外は、私にとって非常に紛らわしいです。誰か私にこれを説明してもらえますか? シリーズ化と何か関係あるの?ありがとう

4

1 に答える 1

0
array.get(i).get(2);

ネストされた ArrayList

array

サイズが 1 であるため、(存在しない) 2 番目の要素を取得しようとすると、OutOfBoundsException が発生します。

name

結果として null になります。配列内のネストされた ArrayList が期待どおりに 2 つの要素を持たない理由を理解する必要があります。

于 2013-04-28T03:10:03.037 に答える