使用 Java 中的 try/catch 将文本文件读入 char[][]

Reading a text file to a char[][] using try/catch in Java

我正在尝试将迷宫文本文件读取为双字符数组,文本文件的格式如下(两个整数分别是行数和列数):

10 10
##########
#        #
#   ###  #
#   #  G #
#   #    #
#        #
#        #
#  #######
#   S    #
##########

到目前为止我的代码:

public char[][] readFile(String filename) {
    char[][] maze = null;
    try {
        Scanner scan = new Scanner(new File(filename));
        int rows = scan.nextInt();
        int columns = scan.nextInt();

        maze = new char[rows][columns];
        String line;

        do {
            for (int i = 0; i < rows; i++) {
                line = scan.nextLine();
                for (int j = 0; j < columns; j++) {
                    maze[i][j] = line.charAt(j);
                }
            }
        } while (scan.hasNextLine());

        scan.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    return maze;
}

我不知道如何 return try/catch 块之外的数组。其他帖子讨论了这个抛出异常,由于实现了一个接口,我不能这样做。

我知道将数组初始化为 null 可以修复任何危险信号,但随后它会在控制台中吐出一个 StringIndexOutOfBounds。

抱歉代码太丑了,但我没有对文件 input/output 进行太多编码。

你读了太多行...

让我们断言您的文件有 12 行,1 行用于大小,10 行用于迷宫,第 12 行用于一些其他输入。

您的代码前 11 行完美运行,但当您的代码完成后,您应该停止继续阅读!

因为一旦您尝试再次阅读迷宫,它似乎就读完了,我假设您尝试阅读一些 与您的输入匹配的内容

boolean doneReading = false;
do {
    if(!doneReading){
        for (int i = 0; i < rows; i++) {
            line = scan.nextLine();
            for (int j = 0; j < columns; j++) {
                maze[i][j] = line.charAt(j);
            }
        }
        //now we have all input, now we can stop reading further
        doneReading = true;
    }
} while (scan.hasNextLine());

而不是阅读完整的文件,你可以简单地return你读完后立即得到结果

(替代版本:return 尽快)

do {
    for (int i = 0; i < rows; i++) {
        line = scan.nextLine();
        for (int j = 0; j < columns; j++) {
            maze[i][j] = line.charAt(j);
        }
    }
    //now we have all input, now we even return
    return maze;
} while (scan.hasNextLine());

你的算法没问题。它只是缺少在 进入第一个循环之前对 scan.nextLine() 的调用,以使扫描器匹配第一行的末尾。

关于异常处理,应该是这样的:

public char[][] readFile(String filename)
{
    char[][] maze;
    try
    {
        ...
        maze=<a useful value>
    }
    catch (FileNotFoundException e)
    {
        e.printStackTrace();
        maze=<a default value, maybe null>
    }
    return maze;
}

应在您正在实现的接口中指定默认值。否则,从 catch 块中抛出一个 RuntimeException 将是两害相权取其轻。