如何知道用 Try/Catch 块捕获什么

How to know what to catch with Try/Catch Block

我只是想用 BufferedReader 读取一个文本文件,我正在使用一个 try-catch 块,它应该可以捕获任何 IOExceptions。我认为是的,甚至添加了一个 FileNotFoundException 以防出现问题。但我仍然得到:

错误:未报告的异常java.lang.Exception;必须被捕获或声明被抛出

而且我不明白我没听懂哪一部分。这是我的代码:

public Grade load(){

Grade newList = new Grade();
try {
  int year;
  String newLine;

  BufferedReader inFile = new BufferedReader(new FileReader(inputName));

  while((newLine = inFile.readLine())!= null){

    year = Integer.parseInt(inFile.readLine());
    newList.addGrade(new Grade(year));  
  } 

  inFile.close();
}//try

 catch (FileNotFoundException e) {
  System.out.println("Failed to copy the file:  "+e.getMessage());}
 catch(IOException e){
  System.out.println("Failed to copy the file:  "+e.getMessage());}

    return newList;
 }//load

我假设 Grade.addGrade 方法或 Grade 构造函数被声明为抛出 java.lang.Exception

在使用Integer.parse方法时捕捉java.lang.NumberFormatException也是一个很好的做法。

答案:

首先,如果你想知道要捕获什么(或者更好地说,抛出什么),你首先需要查看 Java 文档。这向您展示了每个官方支持的每个方法的详细概述 class,因此您最好在执行 input/output 等敏感操作之前查看它。

所以,我建议做的是在现有语句的末尾放置一个额外的 catch 块,并使其捕获 java.lang.Exception,简称为 master exception,所有其他异常都从中派生和扩展。

这不是最理想的问题修复方法,但它不会像在 multi-if 语句末尾放置一个 else 语句那么重要,因为你是在所有其他块失败的情况下简单地提供一个回退块。这只是为了满足编译器的要求而多了一层保护。

代码演示

这只是演示代码,只是为了展示应该 做什么。因为我不知道你的项目是什么,and/or 你在做什么,我只会展示你需要做的事情的准系统,并且我知道我可以对直接或间接结果发生的任何事情负责最终产品中使用了此代码。

public Grade load(){

Grade newList = new Grade();
try {
  int year;
  String newLine;

  BufferedReader inFile = new BufferedReader(new FileReader(inputName));

  while((newLine = inFile.readLine())!= null){

    year = Integer.parseInt(inFile.readLine());
    newList.addGrade(new Grade(year));  
  } 

  inFile.close();
}//try

 catch (FileNotFoundException e) {
  System.out.println("Failed to copy the file:  "+e.getMessage());}
 catch(IOException e){
  System.out.println("Failed to copy the file:  "+e.getMessage());}

    return newList;
 }catch(Exception e){
     e.printStackTrace();
     //...OTHER HANDLING CODE. THE ABOVE COULD BE LEFT BLANK...//
 }//load