0

次のコードは、.datファイルから5つの文字列を読み取り、各文字列から個々の文字を出力する必要があります。

File file = new File("tictactoe.dat");
Scanner scan = new Scanner(file);
String str = "";
int x;
for ( x = 0; x < numGames; x++) {
    str = scan.nextLine();
    for (int i = 0; i < str.length(); i++) {
        out.println(str.charAt(i));
    }
}

しかし、プログラムはをスローしStringIndexOutOfBoundsExceptionます。Scannerテストでは、ファイルの各行が正常に検出されることが示されているため、に問題はありません。しかし、各文字列の特定の文字を取得して印刷しようとすると、プログラムがクラッシュします。

不思議なことに、ループの外側はcharAt()エラーなしで機能します。

ループ内でメソッドを呼び出すと、プログラムがクラッシュするのはなぜですか?

更新:使用していたコードをコピーするというばかげた間違いをしました。上記の更新されたコードを参照してください。StringIndexOutOfBoundsExceptionまた、私がキャッチしていないが原因でプログラムが「クラッシュ」します。

4

4 に答える 4

1

1行目から1文字目、2行目から2文字目などを印刷しているのでエラーになるStringIndexOutOfBoundsExceptionと思います。そのような文字が存在するかどうかを確認しないと、次の行になるポイントがあります。それほど長くはありません。

それが原因ではない場合、私は

  • 例外を読んで、質問に投稿してください。
  • デバッガーを使用してコードをステップ実行し、コードのバグを見つけます。
于 2012-09-26T16:13:47.463 に答える
1

各行の文字数で、行数を混乱させました

File file = new File("tictactoe.dat");
Scanner scan = new Scanner(file);
String str = "";
int x;
int y;
for ( x = 0; x < numGames; x++) {
    str = scan.nextLine();
    for (y = 0; y<str.length(); y++)
    {
        out.println(str.charAt(y));
    }
}
于 2012-09-26T16:17:46.347 に答える
0

あなたの論理には奇妙なことがあります。DATが次のようになっていると仮定します。

12345
67890
abcde
fghij
klmno

コードは次のように出力されます。

1
7
c
i
o

結局のところ、「scanLine」numGames回呼び出して、新しい各行のX位置を取得します。

于 2012-09-26T16:17:17.033 に答える
0

あなたのループはあなたがしたいことをしていません。あなたは言う:

...次に、各文字列から個々の文字を出力します。

しかし、実際に行っているのは、1行目を取得し、その行の最初の文字のみを印刷してから、2行目を取得して、2番目の文字、3行目、3番目の文字を印刷するということです。各文字を別々の行に印刷する場合は、最初のループ内に2番目のループがあり、個々の文字をすべて印刷するために、文字列内の文字を反復処理する必要があります。

char[] characters = str.toCharArray();
for (int i = 0; i < characters.length; i++) {
    System.out.println(characters[i]);
}

または、for-eachループを使用する場合は、さらに良い方法です。

for (char c : str.toCharArray()) {
    System.out.println(c);
}
于 2012-09-26T16:23:10.763 に答える