美文网首页
1.9 try-with-resources 优先于try-fi

1.9 try-with-resources 优先于try-fi

作者: flyjar | 来源:发表于2020-12-11 08:47 被阅读0次

1.9 try-with-resource 优先于try-finally

JDK7 中只要实现了AutoCloseableCloseable 接口的类或接口,都可以使用try-with-resource 来实现异常处理和资源关闭异常抛出顺序。

Java se 7 中的try-with-resource 机制中异常的抛出顺序与Java se 7 以前的版本有一点不一样。是先声明的资源后关闭,JDK7 之前的版本中,如果rd.readLine()rd.close()(在finally块中) 都抛出异常则只会抛出finally块中的异常,不会抛出rd.readLine(); 中的异常。这样经常会导致得到的异常信息不是调用程序想要得到的。

JDK7 及以后版本中如果采用try-with-resource 机制,如果在try-with-resource 声明中抛出异常(可能是文件无法打开或无法关闭)同时rd.readLine(),若抛出异常,则只会抛出rd.readLine() 的异常。

public class AutoCloseableTest {
 // 声明资源时要分析好资源关闭顺序,先声明的后关闭
 // 在try-with-resource中也可以有catch与finally块。
 // 只是catch与finally块是在处理完try-with-resource后才会执行。
    public static void main(String[] args) {
        try (Resource res = new Resource();
             ResourceOther resOther = new ResourceOther();) 
         {
             res.doSome();
             resOther.doSome();
         } catch (Exception ex) {
             ex.printStackTrace();
         }
     }

    // JDK1.7以前的版本,释放资源的写法
     static String readFirstLingFromFile(String path) throws IOException {
         BufferedReader br = null;
       try {
              br = new BufferedReader(new FileReader(path));
              return br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
           if (br != null)
             br.close();
              }
           return null;
      }

 // JDK1.7中的写法,利用AutoCloseable接口
 // 代码更精练、完全
      static String readFirstLineFromFile(String path) throws IOException {
           try (BufferedReader br = new BufferedReader(new FileReader(path))) {
          return br.readLine();
     }
   }
}

//实现AutoCloseable,使用try-with-resources便可以自动关闭了
class Resource implements AutoCloseable {
    void doSome() {
           System.out.println("do something");
    }
    @Override 
    public void close() throws Exception {
        System.out.println("resource closed");
    }
}
class ResourceOther implements AutoCloseable {
   void doSome() {
       System.out.println("do something other");
   }
   @Override
   public void close() throws Exception {
       System.out.println("other resource closed");
   }
}

相关文章

网友评论

      本文标题:1.9 try-with-resources 优先于try-fi

      本文链接:https://www.haomeiwen.com/subject/fubcgktx.html