为什么在java 7中可以捕获IOException,即使永远不会抛出IOException

Ern*_*ano 4 java exception-handling exception try-with-resources

public class SampleCloseable implements AutoCloseable {

    private String name;

    public SampleCloseable(String name){
        this.name = name;
    }

    @Override
    public void close() throws Exception {
        System.out.println("closing: " + this.name);
    }
}
Run Code Online (Sandbox Code Playgroud)

和主要的课程

public class Main{

    public static void main(String args[]) {
      try(SampleCloseable sampleCloseable = new SampleCloseable("test1")){

          System.out.println("im in a try block");

      } catch (IOException  e) {
          System.out.println("IOException is never thrown");

      } catch (Exception e) {

      } finally{
          System.out.println("finally");
      }

    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我在SampleCloseable中的close()方法中删除throws异常时,我收到编译器错误,指出IOException永远不会在相应的try块中抛出.

Rei*_*ica 10

因为你正在抛出一个通用的异常.由于IOException继承自Exception,因此close()方法可能会抛出它.调用者不知道它实际上没有被抛出.它只能看到方法签名,表明它可以.

实际上,close()方法可以自由地抛出任何类型的Exception.当然这是不好的做法,你应该指定你投掷的具体例外情况.