首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用try-finally块处理输入流有什么好处?

使用try-finally块处理输入流有什么好处?
EN

Stack Overflow用户
提问于 2015-09-22 21:25:18
回答 2查看 580关注 0票数 0

下面是我在网上找到的一个Java示例:

代码语言:javascript
复制
try{
      //use buffering
      InputStream file = new FileInputStream("quarks.ser");
      InputStream buffer = new BufferedInputStream(file);
      ObjectInput input = new ObjectInputStream (buffer);
      try{
        //deserialize the List
        List<String> recoveredQuarks = (List<String>)input.readObject();
        //display its data
        for(String quark: recoveredQuarks){
          System.out.println("Recovered Quark: " + quark);
        }
      }
      finally{
        input.close();
      }
} catch(ClassNotFoundException ex){
      //some exception handling
}

在上面的例子中,在关闭输入之前,使用try-finally块对输入执行一些处理有什么好处?换句话说,上面的代码比下面的代码有什么好处:

代码语言:javascript
复制
try{
      //use buffering
      InputStream file = new FileInputStream("quarks.ser");
      InputStream buffer = new BufferedInputStream(file);
      ObjectInput input = new ObjectInputStream (buffer);
      List<String> recoveredQuarks = (List<String>)input.readObject();
      for(String quark: recoveredQuarks){
          System.out.println("Recovered Quark: " + quark);
      }
      input.close();
} catch(ClassNotFoundException ex){
      //some exception handling
}
EN

回答 2

Stack Overflow用户

发布于 2015-09-22 21:30:52

有一个很大的不同:想象一下下面的情况

代码语言:javascript
复制
  InputStream file = new FileInputStream("quarks.ser");
  InputStream buffer = new BufferedInputStream(file);
  ObjectInput input = new ObjectInputStream (buffer);
  try{
    //do sth
    throw new RuntimeException();
    //do sth else
  }
  finally{
    input.close();
  }

在这种情况下,使用finally块会抛出异常,但会执行finally块,因此会关闭您的输入。

如果你的代码是

代码语言:javascript
复制
  InputStream file = new FileInputStream("quarks.ser");
  InputStream buffer = new BufferedInputStream(file);
  ObjectInput input = new ObjectInputStream (buffer);
  //do sth
  throw new RuntimeException();
  //do sth else
  input.close();

您的InputStream将无法正常关闭。

但从Java7开始,最优雅的版本将是使用try-with-resources,正如在对您的问题的评论中所提到的:

代码语言:javascript
复制
try (InputStream file = new FileInputStream ("quarks.ser");
    InputStream buffer = new BufferedInputStream (file);
    ObjectInput input = new ObjectInputStream (buffer);) {
  //do sth
  throw new RuntimeException ();
  //do sth else
}
票数 7
EN

Stack Overflow用户

发布于 2015-09-22 21:40:48

使用try / finally的好处是...或者更好的是尝试资源,是它在很大程度上防止了这样的资源泄漏:

诸若此类。一般来说,这些问题的发生是因为代码中有一些路径没有关闭流/套接字/任何东西。如果该路径被采用得太频繁,则尝试打开新的流等都会失败,因为应用程序已经使用了它可用的所有文件描述符。如果正确使用finally,就可以确保在所有重要的情况下都会发布描述符。

还应该注意的是,你在网上找到的例子是不正确的。至少在理论上是这样。如果BufferedInputStreamObjectInputStream的构造函数抛出异常,那么finally块将不会被执行,并且FileInputStream将被泄漏。

一种更好的编写方法是:

代码语言:javascript
复制
try (InputStream file = new FileInputStream("quarks.ser");
     InputStream buffer = new BufferedInputStream(file);
     ObjectInputStream input = new ObjectInputStream (buffer)) {

     // do stuff

} catch (ClassNotFoundException ex){
      // handling exception
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32718129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档