Effective Java - Prefer try-with-resources to try-finally

在Java7以前,針對需要特別close的資源,會寫程式的人基本上都會放在finally的block中:

    private void close(Closeable closable){
        try {
            if( closable != null )
                closable.close();
        } catch (IOException e) {
            // log
        }
    }
 
    private void load(){
        mProp = new Properties();
        InputStream is = null;
        try {
            is = new FileInputStream(mConfigFilePath);
            mProp.load(is );
        } catch (IOException e) {
            // need to handle ..
        } finally {
            close(is);
        }
    }
這個item要強調的是,在Java7之後,使用try-with-resources會讓你的程式碼更精簡:
        try( InputStream is = new FileInputStream(mConfigFilePath) ){
    		mProp.load(is);
    	} catch (IOException e) {
            // need to handle ..
        }
針對使用的說明,我之前已有文章做分享。這種寫法除了讓你程式碼更精簡外,以上述例子來說,如果load與close都發生例外,是可以透過Exception的getSuppressed去取得這兩個Exception的callstack。

這種寫法也可以應用在stream的close,甚至可以做自己的AutoClose的Lock物件,避免忘記呼叫unlock的情況。

Effective Java第三版Item 9。

  • Effective Java, 3/e