我试图将迷宫文本文件读取到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。
对于丑陋的代码感到抱歉,但我还没有对文件输入/输出做过多次编码。
答案 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
将是两个邪恶中的较小者。