【问题标题】:try-with-resources or close() dilemmatry-with-resources 或 close() 困境
【发布时间】:2013-07-28 08:31:01
【问题描述】:

我有一个可以抛出 IOException 的函数,所以我不会在内部捕获异常。但是我有一些资源要关闭。这样做是否正确,使用 try-with-resource (没有任何 catch 块):

public void workOnFiles() throws IOException {

    try(FileInputStream fis = new FileInputStream("bau.txt");) {
        // Do some stuff
    }       
}

或者我应该这样做:

public void workOnFiles() throws IOException {

    FileInputStream fis = new FileInputStream("bau.txt");
    // Do some stuff
    fis.close();    
}

【问题讨论】:

  • 如果 close 调用位于 finally 块中,则第二个是可以接受的。

标签: java exception-handling


【解决方案1】:

在第二个中,如果抛出异常,您的fis 将不会被关闭。一种选择是将可以引发异常的语句包含在try 块中,并在finally 块中关闭fis

但是,由于您已经使用 Java 7,您应该使用try-with-resource

【讨论】:

    【解决方案2】:

    如果您热衷于使用第二种方法,请关闭finally块中的资源。

    public void workOnFiles() throws IOException {
       FileInputStream fis = null;
       try {
         fis = new FileInputStream("bau.txt");
       // Do some stuff
       }
       finally  {
         try {
          fis.close(); 
         }
         catch(Exception e) {
          //logger.error(e);
          // e.printStackTrace();
         }   
    }
    

    【讨论】:

    • OP 正在使用 Java7 的 try with resource 特性。尝试使用资源块例外 Closeablemplementation 并在出现异常时自动关闭
    • 是的,他提到了,以防万一他需要使用第二种方法,我给他指路了!
    【解决方案3】:

    try-with-resources 总是关闭(Closeable resources) 资源,无论是否引发异常(Work only java7 onwards)

    如果引发异常,您的第二个代码不会关闭资源。
    因此,如果您正在使用java7,则可以使用try-with-resources,或者使用tryfinally 块编辑您的代码。

    finally block guarantees execution irrespective of exception raises or not

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 2013-07-21
      • 1970-01-01
      相关资源
      最近更新 更多