所以我写这段代码(见下文),我的老师说只做一个System.out.println
是不好的做法,我应该做些别的事情来更好地处理这个例外。但是如何?
public static List<Highscore> readHighScoreTable(String fileName) {
//creates a new ArrayList of highscores.
List<Highscore> result = new ArrayList<Highscore>();
try {
//creates a new bufferedReader that reads from the file.
BufferedReader reader = new BufferedReader(new FileReader(fileName));
String line = null;
//a loop that reads through all the lines in the file.
while((line = reader.readLine()) != null) {
//some code }
reader.close();
} catch(IOException ioe) {
//If there is a problem, it prints a error message.
System.out.println("There was a problem reading your file.");
}
return result;
}
非常感谢任何帮助。
答案 0 :(得分:2)
你根本不应该抓住这个例外。
该方法应将IOException
添加到其throws
子句中,以通知调用方无法读取它提供的文件。就像new FileReader()
抛出异常告诉你它无法读取该文件一样。
那样,
简而言之,如果您无法以正确的方式处理异常,因为它不是您的责任,您就不应该抓住异常。或者至少,如果你抓住它,你应该抛出另一个,与最初的例外链接。
此处方法的职责是读取和解析文件。它不处理与用户的交互。因此它应抛出异常,直到负责处理与用户交互的代码可以捕获它并显示错误。
答案 1 :(得分:2)
事实上,你有两种方法可以应对异常
捕获它以让执行继续或将其传播给调用者。
在这里你选择了第一种方式:
catch(IOException ioe) {
//If there is a problem, it prints a error message.
System.out.println("There was a problem reading your file.");
}
但你只是在输出中写了一条文字信息
那还不够。要获取有价值的信息,您需要包含异常的整个堆栈跟踪以及激发它的语句
您可以使用记录器在错误标准中编写它:ioe.printStackTrace()
或更好。
在这里,您选择第一种方式(捕获异常),因为您希望返回列表,即使在IOException
期间Scanner.readLine()
发生finally
时也是如此。
在某些情况下,这可能是可以接受的
在其他情况下,要求可能不同,您不想从异常中恢复。所以你让它传播给来电者
在这种情况下,无论添加什么元素,列表都不会被返回。
这是一个将异常传播给调用者的版本
请注意,在任何情况下都应关闭输入流。
因此,无论是在public static List<Highscore> readHighScoreTable(String fileName) throws IOEexception {
//creates a new ArrayList of highscores.
List<Highscore> result = new ArrayList<Highscore>();
//creates a new bufferedReader that reads from the file.
try (BufferedReader reader = new BufferedReader(new FileReader(fileName))){
String line = null;
//a loop that reads through all the lines in the file.
while((line = reader.readLine()) != null) {
//some code
}
}
return result;
}
语句中还是更好,都可以使用try-with-resources
语句来确保资源释放。
try{
List<Highscore> highScores = readHighScoreTable("filename");
}
catch (IOException e){
// log the exception
// give a feeback to the user
}
代码客户端:
{{1}}
答案 2 :(得分:0)
当您打印一些静态字符串时,您无法理解为什么&amp;发生异常的地方
使用
ioe.printStackTrace();
java.lang.Throwable.printStackTrace()方法打印此throwable 并且它回溯到标准错误流。它打印一个堆栈 跟踪错误输出流上的此Throwable对象 System.err。
字段的值
答案 3 :(得分:0)
你可以做的事情很少:
打印例外原因:System.out.println("There was a problem reading your file, error:" + ioe.getMessage());
打印整个堆栈跟踪(对开发人员有用,但不对最终用户有用):ioe.printStackTrace();
返回null
作为向调用者发出错误信号的信号(但您必须记录该信息)
传播异常,但随后标记您的方法抛出IOException
并将异常处理留给调用者
如果您选择自己处理异常,请确保您没有让程序处于损坏状态,并且您明确告知调用者发生了什么。如果您不能或不愿意这样做,请将处理留给调用者。