使用 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
将是两害相权取其轻。
我正在尝试将迷宫文本文件读取为双字符数组,文本文件的格式如下(两个整数分别是行数和列数):
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
将是两害相权取其轻。