1

スキャナーを使用してファイルを読み取ることができます。戻り型が void の場合、データを読み取ってコンソールに出力できますが、その直後に ArrayOutOfBoundsException がスローされます。理想的には、文字列配列として返したいのですが、ArrayOutOfBoundsException しか得られません。どちらの場合も、cancers[j] = input.nextLine() の行で例外がスローされます。配列のサイズが正しいことを確認しました。そのサイズをハードコーディングしないと、コンパイラは同じ行で NullPointerException をスローします (配列のサイズが宣言されていないため、これは理にかなっています)。

追加の操作を行う必要があるため、文字列配列を返すメソッドが必要です。

public String[] readCancer() {
       cancers = new String[21];
    int j = 0;
        try {
        input = new Scanner(myData);
        String result;
        while(input.hasNext()) {

            ++j;
            cancers[j] = input.nextLine();
            //System.out.println(cancers[j]);
         }

    } catch (FileNotFoundException fnfx) {
        JOptionPane.showMessageDialog(null, "Txt file could not be found");
    }
   return cancers;
}

少し異なる方法でメソッドを書き直そうとしましたが、同じエラーが発生します。今回は output[i] = result; です。

public String[] readCancers() {
    FileInputStream fis;
    DataInputStream dis;
    BufferedReader br;
    InputStreamReader isr;
    String result;
    String[] output = new String[21];
    int i = 0;
    try {
        fis = new FileInputStream(myData);
        dis = new DataInputStream(fis);
        isr = new InputStreamReader(dis);
        br = new BufferedReader(isr);
        while((result = br.readLine()) != null) {
            ++i;
            output[i] = result;
        }
    } catch (FileNotFoundException fnfx) {
        fnfx.printStackTrace();
    } catch (IOException iox) {
        iox.printStackTrace();
    }
    return output;
}
4

2 に答える 2

0

ファイルにいくつの要素があるかを知るのは難しいですが、21 個の要素があると想定しているため、21 個の要素配列が必要です。21 要素の配列を宣言しましたが、次のコード:

 ++j;

以下を意味します。

 j = j+1;

次に、j を使用して配列に要素を追加すると、j = 0 が完全にスキップされ、21 番目の項目が範囲外の配列の 22 番目の要素に配置されます。あなたが望むかもしれないのは次のようなものです:

 cancers[j];
 j++;

または:

 cancers[j++];

そうすれば、限界を超えることはありません。21 を超える項目がある場合は、配列のサイズを増やすことをお勧めします。

于 2013-04-13T02:41:40.107 に答える
0

あなたの質問へのコメント者として:最初の配列要素をスキップしたため、オフバイワンタイプのエラーである可能性があります。しかし、読み込む固定サイズの配列を取得したら、どのような場合でも while ループで i または j の値をバウンド チェックする必要がありwhile(input.hasNext() && j < 20)ますwhile((result = br.readLine()) != null && i < 21)。次に、エラーを示す可能性のある余分な入力があるかどうかをループチェックした後、それを処理する必要があります。

于 2013-04-13T02:46:19.420 に答える