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

标签 java exception exception-handling 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);
    }
}

和主类

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");
      }

    }
}

但是当我在 SampleCloseable 中删除 close() 方法上的抛出异常时 我收到一个编译器错误,指出 IOException 从未在相应的 try block 中抛出。

最佳答案

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

事实上,close() 方法可以自由抛出任何类型的异常。当然,这是不好的做法,您应该指定要抛出的具体异常。

关于java - 为什么在 Java 7 中可以捕获 IOException,即使永远不会抛出 IOException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27586237/

相关文章:

java - 系统找不到文件指定的文档 document = documentBuilder()

Java 字节码反编译——存在未使用的方法?

java - 如何在 Spring Data JPA 中干净地捕获 DAO 服务层异常

c++ - 从模式对话框中抛出异常的最佳做法是什么?

java - 嵌套异常是 org.hibernate.exception.JDBCConnectionException : Unable to acquire JDBC Connection

ruby - 救援超时::来自Redis Gem的错误(Ruby)

php - PDOException 没有被捕获?

java - Accept-Language header 和 ResourceBundle 之间缺少功能

java - If,Else 语句跳过第二个条件

python - 捕获不从 Exception 继承的异常