如何在java中更好地处理此异常?

时间:2018-01-20 10:24:09

标签: java exception exception-handling

所以我写这段代码(见下文),我的老师说只做一个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;
}

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

你根本不应该抓住这个例外。

该方法应将IOException添加到其throws子句中,以通知调用方无法读取它提供的文件。就像new FileReader()抛出异常告诉你它无法读取该文件一样。

那样,

  1. 调用者知道存在问题,而不是获得错误但有效的结果(即空列表)
  2. 调用者可以选择以所需的方式向用户发出错误信号(GUI中的对话框,控制台应用程序中的消息,Web应用程序中的500错误等)。
  3. 调用者可以按照需要/需要的方式处理异常:尝试另一个文件,稍后重试,在文件中记录错误等。
  4. 简而言之,如果您无法以正确的方式处理异常,因为它不是您的责任,您就不应该抓住异常。或者至少,如果你抓住它,你应该抛出另一个,与最初的例外链接。

    此处方法的职责是读取和解析文件。它不处理与用户的交互。因此它应抛出异常,直到负责处理与用户交互的代码可以捕获它并显示错误。

答案 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并将异常处理留给调用者

如果您选择自己处理异常,请确保您没有让程序处于损坏状态,并且您明确告知调用者发生了什么。如果您不能或不愿意这样做,请将处理留给调用者。