【问题标题】:How to correctly close resources?如何正确关闭资源?
【发布时间】:2010-03-02 11:18:14
【问题描述】:

我有所有传播异常的方法,然后我在一个地方进行处理,但是我意识到了一些事情。

假设我有这样的方法

public void foo() throws Exception e {
  Statement stmt = createStatement();
  doSomething(stmt);
  stmt.close();
}

我的问题是,如果 doSometing() 方法抛出异常,语句将不会关闭,但我不想在那里处理异常。尝试并捕获仅重新抛出异常并最终关闭语句的正确方法是否正确?

【问题讨论】:

    标签: java exception-handling


    【解决方案1】:
    public void foo() throws Exception e {
    
      Statement stmt = null ; 
      try {
        stmt = createStatement();
        doSomething(stmt);
      } finally {
        if(stmt != null) 
          stmt.close();
      }
    }
    

    【讨论】:

      【解决方案2】:

      在 finally 块中关闭它。所有打开的资源都应该被释放/关闭。
      查看更多信息 - http://www.ibm.com/developerworks/java/library/j-jtp03216.html

      【讨论】:

        【解决方案3】:

        修改为nos答案。您实际上可以在尝试块之前初始化 stmt。这样就不用看是不是null了,这样就够了:

        public void foo() throws Exception e {
        
          final Statement stmt = createStatemnt( );
        
          try {
            doSomething(stmt);
          } finally {
            stmt.close();
          }
        }
        

        【讨论】:

          【解决方案4】:

          是的,你可以进一步抛出异常

          try {
             stmt = createStatement();
             doSomething(stmt);
          }
           catch (Exception e) {
              throw e;
          }
          finally {
             if(stmt != null) 
                stmt.close();
          }
          

          【讨论】:

          • 不需要添加那个 catch 块,因为方法已经声明了抛出异常。你可以有一个没有 catch 的 try-finally 块
          • 你为什么要在这里费心抓又扔?尝试...终于可以正常工作而无需重新抛出。 java.sun.com/docs/books/jls/third_edition/html/…
          • 我错过了签名中的抛出,我认为问题是如果在 catch 块中进一步抛出异常是否有效。
          猜你喜欢
          • 2011-08-12
          • 2015-03-15
          • 2017-06-21
          • 1970-01-01
          • 1970-01-01
          • 2013-04-02
          • 1970-01-01
          • 1970-01-01
          • 2016-02-03
          相关资源
          最近更新 更多