2012年10月9日 星期二

Java SE 7 - Exception - try with resources 自動嘗試

在SE 7之前如果要確保資源的正確關閉,通常都會將資源關閉寫在finally如下:

public static String readFile(String name) throws FileNotFoundException {
     StringBuilder builder = new StringBuilder();
     Scanner scanner = null;
     try {
         scanner = new Scanner(new FileInputStream(name));
         while (scanner.hasNext()) {
             builder.append(scanner.nextLine());
             builder.append('\n');
         }
     } catch(FileNotFoundException ex) {
         ex.printStackTrace();
         throw ex;
     } finally {
         if(scanner != null) {
             scanner.close();
         }
     }
     return builder.toString();
}

在SE7後,只要有實作java.lang.AutoCloseable Inteface就可以使用以下寫法:

public static String readFile(String name) throws FileNotFoundException {
    StringBuilder builder = new StringBuilder();
    try(Scanner scanner = new Scanner(new FileInputStream(name))) {
        while (scanner.hasNext()) {
            builder.append(scanner.nextLine());
            builder.append('\n');
        }
    } catch(FileNotFoundException ex) {
        ex.printStackTrace();
        throw ex;
    }
    return builder.toString();
}

不管是否是正常執行還是異常中斷,java都會呼叫介面所定義的close方法。try裡面也可以使用多個物件,以分號區隔,越後面的物件會越早被關閉資源

以下為java.lang.AutoCloseable Inteface所需實作的規範
http://docs.oracle.com/javase/7/docs/api/java/lang/AutoCloseable.html

上述範例中的Scanner在SE 7也是有實作java.lang.AutoCloseable Inteface
http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html


轉貼請註明出處,最好直接使用聯結轉貼!Thanks~
作者: Samuel
日期:2012/10/06

沒有留言:

張貼留言