使用Java

时间:2016-10-19 01:28:32

标签: java arrays char maze

我试图将迷宫文本文件读取到double char数组,文本文件的格式如此(两个整数分别是行数和列数):

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;
}

我不知道如何在try / catch块之外返回数组。其他帖子通过此抛出异常,由于实现了接口,我无法做到这一点。

我知道将数组初始化为null会修复任何红色标记,但是它会在控制台中吐出一个StringIndexOutOfBounds。

对于丑陋的代码感到抱歉,但我还没有对文件输入/输出做过多次编码。

2 个答案:

答案 0 :(得分:0)

你读了太多行......

让我们断言你的文件有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());

而不是读完整个文件,只要你读完就可以直接返回结果

(替代版本:尽快返回)

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());

答案 1 :(得分:0)

你的算法没问题。它只是在进入第一个循环之前没有调用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;
}

应在您正在实施的界面中指定默认值。或者,从RuntimeException块中抛出catch将是两个邪恶中的较小者。