JDK7 ã使ãæºåãåºæ¥ãã®ã§ãä½å½ãããã¾ãã
Java7 ã§ã®å人çã«å¬ããã®ã try-with-resources Statement ã§ããAutoCloseable ï¼ãå®è£ ããã¯ã©ã¹ï¼ã®å¤æ°ããã®æ§æã§åæåããã¨ãåæã« close ãã¦ãããã£ã¦ãã®ã§ãã
ã§ã¯ããã£ã¨ä½¿ã£ã¦ã¿ã¾ãã
public class TryWithResources { public static void main(String[] args) { try (AutoCloseable imp = new AutoCloseableImpl()) { // New! System.out.println("hoge"); } catch(Exception e) { System.out.println("catch:" + e); } finally { System.out.println("finally"); } } } class AutoCloseableImpl implements AutoCloseable { @Override public void close() throws Exception { System.out.println("close"); } }
ç´ ç´ã«å®è¡ããã¨ãããªãã¾ããã
hoge close finally
ã³ã³ã¹ãã©ã¯ã¿ãä¾å¤ãæãã¡ãã㨠close ã¯å¼ã°ãã¾ããã
catch:java.lang.RuntimeException finally
close ãä¾å¤ãæããå ´å㯠catch ããã¾ãã
hoge close catch:java.lang.Exception finally
ãªããtry ã®å¾ãã§ãã£ã¼ã«ãã®å®£è¨ã¨åæåãããã°è¯ãã®ã§ãããã§ãã³ã³ãã¤ã«åºæ¥ã¾ããnull ã® closeã¡ã½ãããå®è¡ãããã¨ãã¡ããã®ã§ NullPointerException ã«ãªãã¾ãããã©ãã *1
try (AutoCloseable c = null) { }
ãªã½ã¼ã¹ã¯è¤æ°ä½¿ããã®ã§ã2ã¤ä½¿ã£ãä¸ã§ãtry å ã§ä¾å¤ãæãã¦ã¿ã¾ãã
public class TryWithResources { public static void main(String[] args) { try (AutoCloseable imp1 = new AutoCloseableImpl(); AutoCloseable imp2 = new AutoCloseableImpl()) { System.out.println("hoge"); throw new IllegalStateException(); } catch (Exception e) { System.out.println("catch:" + e); } finally { System.out.println("finally"); } } } class AutoCloseableImpl implements AutoCloseable { public AutoCloseableImpl() { System.out.println(this.hashCode()); } @Override public void close() throws Exception { System.out.println("close:" + this.hashCode()); } }
åæåãããéé 㧠close ããããã®å¾ã«ä¾å¤å¦çãè¡ããã¾ããã
536841258 1112222159 hoge close:1112222159 close:536841258 catch:java.lang.IllegalStateException finally
2ã¤ãã®åæåã§ä¾å¤ãæããå ´åã1ã¤ãã®ã¿ close ããã¾ããã
1112222159 1420162825 close:1112222159 catch:java.lang.RuntimeException: 1420162825 finally
2ã¤ãã® close ã§ä¾å¤ãæãã¦ãã1ã¤ãã¯ã¡ãã㨠close ããã¾ããã
536841258 1112222159 hoge close:536841258 catch:java.lang.RuntimeException: 1112222159 finally
2ã¤ã¨ãä¾å¤ãæããå ´åãæåã«æããããæ¹ã catch ããã¾ããã
1112222159 1420162825 hoge catch:java.lang.RuntimeException: 1420162825 finally
ãããçæ¹ã®ä¾å¤ãæ¶ãã¦ãã¾ãï¼ããããªãï¼ããã ããæè¿ã®è¥ãããã¯â¦ããªãã¦æ¹ã®ããã«ãThrowable.getSuppressed() ãããã¾ãã以ä¸ã®ã³ã¼ãã¯ã主å¦çã§ä¾å¤ãæãããã両æ¹ã® close ã§ãæããããå ´åã§ãã
public class TryWithResources { public static void main(String[] args) { try (AutoCloseable imp1 = new AutoCloseableImpl(); AutoCloseable imp2 = new AutoCloseableImpl(imp1)) { System.out.println("hoge"); throw new RuntimeException("hoge"); } catch (Exception e) { System.out.println("catch:" + e); for (Throwable t : e.getSuppressed()) { // New! System.out.println("suppressed:" + t); } } finally { System.out.println("finally"); } } }
æåã«æããããä¾å¤ã catch ãããä»ã¯ suppressed ã«å ¥ãã¾ããã
83812901 2041638322 hoge catch:java.lang.RuntimeException: hoge suppressed:java.lang.RuntimeException: 2041638322 suppressed:java.lang.RuntimeException: 83812901 finally
以ä¸ãè¸ã¾ãã¦åæ§ã®æåã Java6 ã§å®è£
ãã¦ã¿ããã¨ãããããããªãã¨ã«ãªã£ã¦ãã¾ãã¾ããããªã Throwable.getSuppressed() ã Java7 ãããªã®ã§ãããã¯è«¦ãã¾ããã
public class J6TryWithResources { public static void main(String[] args) { try { Closeable a = null; boolean closeA = false; Closeable b = null; boolean closeB = false; try { a = new CloseableImpl(); closeA = true; b = new CloseableImpl(); closeB = true; System.out.println("hoge"); } finally { Exception e = null; try { if (closeB) { b.close(); } } catch (Exception ex) { e = ex; } try { if (closeA) { a.close(); } } catch (Exception ex) { if (e == null) { e = ex; } } if (e != null) { throw e; } } } catch (Exception e) { System.out.println("catch:" + e); } finally { System.out.println("finally"); } } }
ãã訳ããããã¾ãããããã¨ãªããæ°ããæ§æã使ãã¾ãããã
*1:2011/2/27å½æã®1.7.0-eaã§ã®æåã1.7.0_11ã§å®è¡ãããcloseã¯å®è¡ããã¾ããã§ããã