2012-07-24 52 views
5

我有以下Java類,它執行一件事情,從config.properties中觸發值。我需要用try/catch/finally塊來包圍fileInputStream.close嗎?它是如何完成的?

當談到關閉fileInputStream的時候,我想我在維基百科上讀過,最好能在最後一個塊中使用它。因爲它在try/catch塊中工作得很好。

你能告訴我糾正得到fileInputStream.close()在最後一節嗎?

ConfigProperties.java package base;

import java.io.FileInputStream; 
import java.util.Properties; 

public class ConfigProperties { 

    public FileInputStream fileInputStream; 
    public String property; 

    public String getConfigProperties(String strProperty) { 

     Properties configProperties = new Properties(); 
     try { 

      fileInputStream = new FileInputStream("resources/config.properties"); 
      configProperties.load(fileInputStream); 
      property = configProperties.getProperty(strProperty); 
      System.out.println("getConfigProperties(" + strProperty + ")"); 

      // use a finally block to close your Stream. 
      // If an exception occurs, do you want the application to shut down? 

     } catch (Exception ex) { 
      // TODO 
      System.out.println("Exception: " + ex); 
     } 
     finally { 
      fileInputStream.close(); 
     } 

     return property; 
    } 
} 

解決方案只是按照Eclipse的建議,並在finally塊中執行此操作嗎?

finally { 
    try { 
     fileInputStream.close(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

謝謝大家!

+1

FYI:公地IO有一個很好的功能:IOUtils.closeQuietly()將關閉try/catch。你的代碼看起來好多了:)請記住,這個函數並沒有給你迴應IOException的機會,但通常人們不會這樣做,並且無論如何都會忽略異常。如果您需要回應,請製作您自己的實用程序方法,記錄或打印堆棧跟蹤或您需要執行的任何操作。 – Matt 2012-07-24 00:42:57

回答

7

因爲FileInputStream.close()拋出一個IOException,finally {}塊不會捕獲異常。所以你需要捕捉它或者爲了編譯而聲明它。 Eclipse的建議很好,捕獲finally {}塊內的IOException。

+0

您也可以使用[IOUtils.closeQuietly()](http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/IOUtils.html#closeQuietly( java.io.Closeable))來自Commons IO的方法。它包裝close方法以拋出所有拋出的IOException。比另一個try/catch塊更清潔。 – 2013-09-12 02:07:32

11

是的,這是Java 7之前的通用解決方案。然而,與引進的Java 7的,現在有try-with-resource語句,它會自動關閉任何聲明資源時try塊退出:

try (FileInputStream fileIn = ...) { 
    // do something 
} // fileIn is closed 
catch (IOException e) { 
    //handle exception 
} 
7

的標準方法是:

FileInputStream fileInputStream = null; 
try { 
    fileInputStream = new FileInputStream(...); 
    // do something with the inputstream 
} catch (IOException e) { 
    // handle an exception 
} finally { // finally blocks are guaranteed to be executed 
    // close() can throw an IOException too, so we got to wrap that too 
    try { 
     if (fileInputStream != null) { 
      fileInputStream.close(); 
     }   
    } catch (IOException e) { 
     // handle an exception, or often we just ignore it 
    } 
} 
相關問題