1. Gambaran keseluruhan
Sokongan untuk mencuba dengan sumber - diperkenalkan di Java 7 - memungkinkan kita untuk menyatakan sumber yang akan digunakan dalam blok percubaan dengan jaminan bahawa sumber daya akan ditutup ketika setelah pelaksanaan blok tersebut.
Sumber yang dinyatakan mesti melaksanakan antara muka AutoCloseable .
2. Menggunakan sumber daya mencuba
Sederhananya, untuk ditutup secara automatik, sumber mesti dinyatakan dan diinisialisasi dalam percubaan , seperti yang ditunjukkan di bawah:
try (PrintWriter writer = new PrintWriter(new File("test.txt"))) { writer.println("Hello World"); }
3. Menggantikan try - catch-akhirnya Dengan try-with-resources
Kaedah yang mudah dan jelas untuk menggunakan fungsi try-with-resources yang baru adalah dengan menggantikan blok try-catch-akhirnya tradisional dan verbose .
Mari bandingkan contoh kod berikut - pertama adalah blok khas cubaan-tangkapan-akhirnya , kemudian pendekatan baru, menggunakan blok cuba-dengan-sumber yang setara:
Scanner scanner = null; try { scanner = new Scanner(new File("test.txt")); while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException e) { e.printStackTrace(); } finally { if (scanner != null) { scanner.close(); } }
Dan inilah penyelesaian yang ringkas menggunakan sumber daya percubaan:
try (Scanner scanner = new Scanner(new File("test.txt"))) { while (scanner.hasNext()) { System.out.println(scanner.nextLine()); } } catch (FileNotFoundException fnfe) { fnfe.printStackTrace(); }
Di sinilah anda dapat meneroka kelas Pengimbas dengan lebih jauh .
4. cuba-dengan-sumber dengan pelbagai sumber
Pelbagai sumber boleh dinyatakan baik-baik saja dalam blok cubaan dengan sumber dengan memisahkannya dengan titik koma:
try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) { while (scanner.hasNext()) { writer.print(scanner.nextLine()); } }
5. Sumber Khusus Dengan AutoCloseable
Untuk membina sumber adat yang akan betul dikendalikan oleh cuba-dengan-sumber blok, kelas perlu melaksanakan Closeable atau AutoCloseable antara muka, dan mengatasi berhampiran kaedah:
public class MyResource implements AutoCloseable { @Override public void close() throws Exception { System.out.println("Closed MyResource"); } }
6. Perintah Penutup Sumber
Sumber yang ditentukan / diperoleh pertama akan ditutup terakhir; mari kita lihat contoh tingkah laku ini:
Sumber 1:
public class AutoCloseableResourcesFirst implements AutoCloseable { public AutoCloseableResourcesFirst() { System.out.println("Constructor -> AutoCloseableResources_First"); } public void doSomething() { System.out.println("Something -> AutoCloseableResources_First"); } @Override public void close() throws Exception { System.out.println("Closed AutoCloseableResources_First"); } }
Sumber 2:
public class AutoCloseableResourcesSecond implements AutoCloseable { public AutoCloseableResourcesSecond() { System.out.println("Constructor -> AutoCloseableResources_Second"); } public void doSomething() { System.out.println("Something -> AutoCloseableResources_Second"); } @Override public void close() throws Exception { System.out.println("Closed AutoCloseableResources_Second"); } }
Kod:
private void orderOfClosingResources() throws Exception { try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst(); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) { af.doSomething(); as.doSomething(); } }
Pengeluaran:
Pembina -> AutoCloseableResources_First
Pembina -> AutoCloseableResources_Second
Sesuatu -> AutoCloseableResources_First
Sesuatu -> AutoCloseableResources_Second
AutoCloseableResources_Second Tertutup
AutoCloseableResources_First yang ditutup
7. tangkapan & akhirnya
A cuba-dengan-sumber blok masih boleh mempunyai tangkapan dan akhirnya blok - yang akan bekerja dengan cara yang sama seperti dengan tradisional cuba blok.
8. Java 9: Akhir BerkesanPemboleh ubah
Sebelum Java 9, kami hanya dapat menggunakan pemboleh ubah baru di dalam blok cubaan dengan sumber :
try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) { // omitted }
Seperti yang ditunjukkan di atas, ini sangat verbose ketika menyatakan pelbagai sumber. Seperti Java 9 dan sebagai sebahagian dari JEP 213, kita sekarang boleh menggunakan pemboleh ubah akhir atau bahkan berkesan dalam blok cubaan dengan sumber :
final Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt")) try (scanner;writer) { // omitted }
Ringkasnya, pemboleh ubah secara efektif adalah muktamad jika tidak berubah setelah tugasan pertama, walaupun tidak secara jelas ditandai sebagai akhir .
Seperti yang ditunjukkan di atas, pemboleh ubah pengimbas dinyatakan akhir secara eksplisit, jadi kami dapat menggunakannya dengan blok cubaan dengan sumber . Walaupun pemboleh ubah penulis tidak final secara eksplisit , ia tidak berubah selepas tugasan pertama. Oleh itu, kami juga dibenarkan menggunakan pemboleh ubah penulis .
9. Kesimpulannya
Dalam artikel ini, kami telah membincangkan cara menggunakan try-with-resources, bagaimana mengganti try , catch , dan akhirnya dengan try-with-resources, membina sumber daya khusus dengan AutoCloseable dan memerintahkan sumber ditutup.
Kod sumber lengkap untuk contoh boleh didapati dalam projek GitHub ini.