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

我原以为错误会出现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

你的循环没有做你想做的事。你说:

...然后从每个字符串中打印每个单独的字符。

但它实际上做的是获取第 1 行,只打印该行的第一个字符,然后获取第二行并打印第二个字符、第三行和第三个字符,依此类推。如果您在单独的行上打印每个字符,则需要在第一个循环内有第二个循环,该循环遍历字符串中的字符,以便打印所有单独的字符。

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 回答
0

你的逻辑有些奇怪。假设 DAT 为:

12345
67890
abcde
fghij
klmno

您的代码将打印:

1
7
c
i
o

毕竟,您调用“scanLine”numGames 次并在每个新行上获取 X 位置。

于 2012-09-26T16:17:17.033 回答