0

を修正するのに最も苦労していますArrayIndexOutOfBoundsException

ファイルから1行ずつ読み取るメソッドがあります。行の名前とIDがメソッドに渡すいくつかの変数と一致する場合は、その行を配列に保存します。

このプログラムはクイズをシミュレートします。ユーザーは同じ名前とIDを2回以上使用することはできません。したがって、ファイルには同じ名前とIDの2行しか含まれていません。

tempファイルからこれらの2行を保持するために名前を付けた配列を作成しました。ファイルが空の場合、ユーザーは2回試行し、再試行すると拒否されます。したがって、別の名前とIDを入力すると、さらに2回試行する必要があります。この時点で、ファイルには前のユーザーからの2行が含まれていますが、新しいユーザーが試行すると、テストは1回しか受けられません。彼が2回目に試行すると、配列の範囲外例外が発生します。

私の質問は次のとおりです。配列tempは以前の値を保持しているので、例外が発生するのはなぜですか?

private String readFile(String id, String name) {
    String[] temp = new String[3];
    int i = 1;
    int index = 0;
    String[] split = null;
    String idCheck = null;
    String nameCheck = null;
    temp = null;

    try {
        BufferedReader read = new BufferedReader(new FileReader("studentInfo.txt"));
        String line = null;           

        try {
            while ((line = read.readLine()) != null) {
                try {
                    split = line.split("\t\t");
                } catch (Exception ex) {
                }

                nameCheck = split[0];
                idCheck = split[1];

                if (idCheck.equals(id) && nameCheck.equals(name)) {
                    temp[index] = line;
                }

                index++;
            }
            read.close();
        } catch (IOException ex) {
        }
    } catch (FileNotFoundException ex) {
    }

    if (temp != null) {
        if (temp[1] == null) {
            return temp[0];
        }
        if (temp[1] != null && temp[2] == null) {
            return temp[1];
        }
        if (temp[2] != null) {
            return temp[2];
        }
    }

    return null;
}
4

3 に答える 3

1

範囲外のインデックス例外を取得できる場所が 2 つあります。最初はこのコードです:

try {
    split = line.split("\t\t");
} catch (Exception ex) {
}
nameCheck = split[0];
idCheck = split[1];

"\t\t"行にシーケンスがない場合、split要素は 1 つしかなく、アクセスしようとするsplit[1]と例外がスローされます。(余談ですが、黙って例外を無視してはいけません!)

2 つ目 (そして問題の原因である可能性が高い) は、indexID と名前が一致する行ごとにインクリメントしているため、そのような 3 行目を読むindexと、 の添字として範囲外になりますtemp

ループ条件に含めることも、 for の代わりに for を使用するindex < temp.lengthこともできます。そうすれば、文字列を無制限に追加できます。whileArrayList<String>tempString[]

于 2012-12-12T19:37:35.830 に答える
0

設定後temp = null;

temp への次の参照は次のとおりです。

if (idCheck.equals(id) && nameCheck.equals(name)) {

    temp[index] = line;
}

行を削除する必要があると思いますtemp = null;。その行の上でインスタンス化したばかりの配列を破棄するだけです。

そのインデックスは私を少し緊張させますが、読み取られるファイルが3行を超えることはないと確信しているなら...

于 2012-12-12T19:43:32.223 に答える
0

これは起こり得ることです

    String[] split = "xxx\tyyyy".split("\t\t");
    System.out.println(split[0]);
    System.out.println(split[1]);

.

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Test.main(Test.java:17)
于 2012-12-12T19:36:47.127 に答える