try-with-resources statement

5305 ワード

転入先https://www.cnblogs.com/memory4young/p/example-of-try-with-resources-statement.html https://blog.csdn.net/llkoio/article/details/78939148
リソース付きtry文(try-with-resource)の最も簡単な形式は、次のとおりです.
    try(Resource res = xxx)//       
    {
         work with res
    }                                                                        

tryブロックが終了するとres.close()メソッドが自動的に呼び出され、リソースが閉じます.とても使いやすい文法で、finallyをたくさん書く必要はありません.リソースを閉じるために、Closeableを実現するすべてのクラス宣言を書くことができます.ストリーム操作、socket操作、新版httpclientにもよく見られます.なお、try()のカッコには複数行の宣言を書くことができ、各宣言の変数タイプはCloseableのサブクラスで、セミコロンで区切らなければならない.補足すると、この構文がない前に、フロー操作は一般的にこのように書かれています.
InputStream is = null;
OutputStream os = null;
try {
    //...
} catch (IOException e) {
    //...
}finally{
    try {
        if(os!=null){
            os.close();
        }
        if(is!=null){
            is.close();
        }
    } catch (IOException e2) {
        //...
    }
}   

このように書くことができます
try (
                InputStream is = new FileInputStream("...");
                OutputStream os = new FileOutputStream("...");
        ) {
            //...
        } catch (IOException e) {
            //...
        }
package org.young.elearn;

import java.io.FileOutputStream;
import java.io.IOException;

import org.junit.Test;

/**
 * try-with-resources    
 * try(resouces)
 * {
 * 
 * } catch (Exception e){}
 * 
 *    resource     
 * 
 * 1. resource       java.lang.AutoCloseable
 * 2.          try   
 * 
 * 
 *
 * @author by Young.ZHU
 *      on 2016 5 29 
 *
 * Package&FileName: org.young.elearn.TryWithResourcesTest
 */
public class TryWithResourcesTest {

    /**
     *               
     */
    @Test
    public void test() {

        try (MyResources mr = new MyResources()) {
//            mr.doSomething(4);
            mr.doSomething(9);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     *     :
     * The resource f of a try-with-resources statement cannot be assigned
     */
    @Test
    public void test2() {
        try (FileOutputStream f = null;) {
//            f = new FileOutputStream(new File(""));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     *     :
     * The resource type File does not implement java.lang.AutoCloseable
     */
    @Test
    public void test1() {
        /*try (File file = new File("d:\\xx.txt");) {

        } */
    }

}

class MyResources implements AutoCloseable {

    @Override
    public void close() throws Exception {
        System.out.println("resources are closed.");
    }

    public void doSomething(int num) throws Exception {
        if (num % 2 == 0) {
            System.out.println("it's OK.");
        } else {
            throw new Exception("Enter an even.");
        }
    }
}