1

私のプログラムは準拠していますが、プログラムを実行すると、「Array Index Out of Bounds Exception」が発生します。

public void readBoard(String filename) throws Exception { 
    File f = new File("myBoard.csv"); 
    Scanner reader = new Scanner(f); 
    while(reader.hasNext()){ 
        String line = reader.nextLine(); 
        String [] b = line.split(","); 
        String type = b[0]; 
        int i = Integer.parseInt(b[1]); 
        int j = Integer.parseInt(b[2]); 
        if(type.equals("Chute")) 
            board[i][j] = new Chute(); 
        else if(type.equals("Ladder")) 
            board[i][j] = new Ladder(); 
}

エラーは int i = Integer.parseInt(b[1]); にあります。私の質問は、文字列 [1] と [2] を正しい int に変換する方法です。範囲外の配列の例外があるため、そうではないと思います。エリア内のスポットを指していて、何もないという意味だと思います。

4

4 に答える 4

1

行分割が正常に機能し、b[1] または b[2] でエラーが発生する 3 つの異なる文字列があることを確認してください。印刷またはデバッグして、b[0] の値を確認します。

于 2013-04-24T23:49:24.820 に答える
1

IndexOutOfBounds は、配列に存在しない要素にアクセスしようとしていることを意味します。追加:

System.out.println("array size = " + b.length);

配列の実際の長さを確認します。配列の長さは 3 であると予想されますが、実際に読み取られた行とそれを分割する方法に基づいて、長さ 1 の配列があるように見えます。分割しようとしています。

これを試して:

public void readBoard(String filename) throws Exception{
    File f = new File("myBoard.csv");
    Scanner reader = new Scanner(f);
    while(reader.hasNext()){
        String line = reader.nextLine();

        // What line do we intend to process?

        System.out.println("Line = " + line);

        String [] b = line.split(",");

        // How long is the array?

        System.out.println("Array length = " + b.length);

        String type = b[0];
        int i = Integer.parseInt(b[1]);
        int j = Integer.parseInt(b[2]);
        if(type.equals("Chute"))
            board[i][j] = new Chute();
        else if(type.equals("Ladder"))
            board[i][j] = new Ladder();
    }

コードの開発中はいつでも、さまざまなフィールドの値をダンプするデバッグ ステートメントを追加して、自分が何をしているかを確認できるようにします。コードのあちこちにいくつかの重要なデバッグ ステートメントを散りばめることで、仮定 (つまり、「私の配列には 3 つの要素がある」) と実際に何が起こっているか (つまり、「私の配列には 1 つの要素しかない」) を調整するのに役立ちます。

于 2013-04-24T23:49:35.167 に答える
1

これを試してみてください。配列サイズが 1 であるため範囲外だったので、サイズが 1 のすべての配列をスキップする必要があります。

public void readBoard(String filename) throws Exception {
    File in = new File("myBoard.csv");
    Scanner reader = new Scanner(in);
    while (reader.hasNext()) {
        String line = reader.nextLine();
        String[] b = line.split(",");
        if (b.length != 1) {
            String type = b[0];
            int i = Integer.parseInt(b[1]);
            int j = Integer.parseInt(b[2]);
            if (type.equals("Chute"))
                board[i][j] = new Chute();
            else if (type.equals("Ladder"))
                board[i][j] = new Ladder();
        }
    }
}
于 2013-04-25T01:20:40.753 に答える
0

while ループの前にこれを行う

reader.nextLine[];

ファイルの最初の行には要素が 1 つしかないためです。

于 2013-04-26T21:54:22.240 に答える