import java.io.*;public class InputFile {
  private BufferedReader in;
  public InputFile(String fname) throws Exception {
    try {
      in = new BufferedReader(new FileReader(fname));
    } catch(FileNotFoundException e) {
      System.out.println("Could not open " + fname);
      throw e;    //这里为什么要重新把 FileNotFoundException 这个异常给抛出去?既然已经捕获了这个
//异常,何必再把它抛向上一层呢?
    } catch(Exception e) {
      try {
        in.close();
      } catch(IOException e2) {
        System.out.println("in.close() unsuccessful");
      }
      throw e; 
    } finally {
    }
  }
  public String getLine() {
    String s;
    try {
      s = in.readLine();
    } catch(IOException e) {
      throw new RuntimeException("readLine() failed");
    }
    return s;
  }
  public void dispose() {
    try {
      in.close();
      System.out.println("dispose() successful");
    } catch(IOException e2) {
      throw new RuntimeException("in.close() failed");
    }
  }
}

解决方案 »

  1.   


    再往上抛Exception, 是为了不让后面的程序继续执行
      

  2.   

    也就是说,如果这里第一个catch 被执行后,这个构造函数里的 finally 就不执行了。完全只是处于这个目的,而设计的?
      

  3.   

    finally是肯定被执行的,再抛出异常是让调用这个方法或类的知道有异常抛出需要捕获或再抛出
      

  4.   

    这与finally没关系,不管怎样,它都会执行的,
    抛出去后外面的程序就可以catch到,这样就能知道问题的详细信息,以做出相应的动作
      

  5.   

    抛出这个异常其实是因为 他不想在这里处理这个异常 想让调用这个方法的人知道有这个异常 并且让他处理 还有finally怎么可能不被执行呢-0-
      

  6.   

    抛出去,让有能力解决这个异常的方法来解决这个异常,如果你不抛,仅仅是System.out.println("Could not open " + fname);那异常还是没解决。而且还妨碍了其他上层代码解决异常,占着茅坑不拉屎