Menguasai Java Try-with-Resources: Manajemen Sumber Daya Otomatis Dijelaskan
Menguasai Java Try-with-Resources
Jelajahi bagaimana pernyataan try-with-resources Java menyederhanakan penanganan sumber daya, mencegah kebocoran, dan meningkatkan keterbacaan kode.
Konstruk try-with-resources menjamin bahwa semua sumber daya yang dideklarasikan dalam tanda kurungnya akan ditutup secara otomatis saat blok keluar, baik secara normal atau tiba-tiba. Sebuah sumber daya adalah objek apa pun yang mengimplementasikan AutoCloseable atau Closeable.
Sintaksnya adalah:
try (ResourceType resource = new ResourceType(...)) { // gunakan sumber daya } catch (ExceptionType e) { // tangani pengecualian }
Untuk menggunakannya Anda:
- Menginstantiasi sumber daya dalam klausa
try. - Deklarasikan penanganan pengecualian untuk kesalahan apa pun yang mungkin timbul selama penggunaan atau penutupan.
Catatan: Hanya objek yang mengimplementasikan
AutoCloseable yang dapat dikelola secara otomatis.
Contoh 1: Membaca File dengan Aman
import java.io.*; public class Main { public static void main(String[] args) { try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { String line; while ((line = br.readLine()) != null) { System.out.println("Line =>" + line); } } catch (IOException e) { System.out.println("IOException in try-with-resources block =>" + e.getMessage()); } } }
Output jika test.txt hilang:
IOException in try-with-resources block =>test.txt (No such file or directory)
Output ketika file ada:
Line =>test line
Di sini, BufferedReader ditutup secara otomatis setelah blok, menghilangkan kebutuhan untuk klausa finally.
Pengecualian Ditekan
Saat baik blok try maupun penutupan sumber daya melempar pengecualian, pengecualian dari blok try mengambil prioritas, sementara yang lain ditekan. Anda dapat mengambil pengecualian yang ditekan melalui Throwable.getSuppressed():
catch (IOException e) { System.out.println("Thrown exception =>" + e.getMessage()); for (Throwable t : e.getSuppressed()) { System.out.println("Suppressed exception =>" + t); } }
Mengapa Menggunakan Try-with-Resources?
1. Menghilangkan Pembersih Manual
Sebelum Java 7, blok finally wajib untuk menutup sumber daya. Itu menambahkan boilerplate dan potensi nested try-catch di dalam finally jika penutupan itu sendiri melempar pengecualian. Dengan try-with-resources, pembersih bersifat implisit:
BufferedReader br = null; try { br = new BufferedReader(new FileReader("test.txt")); // gunakan br } catch (IOException e) { // tangani } finally { if (br != null) { try { br.close(); } catch (IOException ignored) {} } }
Pola di atas lebih bertele-tele dan rawan kesalahan dibandingkan dengan:
try (BufferedReader br = new BufferedReader(new FileReader("test.txt"))) { // gunakan br }
2. Beberapa Sumber Daya dalam Satu Pernyataan
Deklarasikan beberapa sumber daya dipisahkan dengan titik koma. Mereka ditutup dalam urutan terbalik dari deklarasi.
try (Scanner scanner = new Scanner(new File("testRead.txt")); PrintWriter writer = new PrintWriter(new File("testWrite.txt"))) { while (scanner.hasNext()) { writer.print(scanner.nextLine()); } }
3. Peningkatan Java 9
Java 9 melonggarkan persyaratan bahwa sumber daya harus dideklarasikan secara lokal. Anda sekarang dapat menggunakan kembali variabel yang ada:
Scanner scanner = new Scanner(new File("testRead.txt")); try (scanner) { // kode }
Fitur ini meningkatkan keterbacaan saat sumber daya yang sama diperlukan di tempat lain.
Untuk wawasan lebih dalam, lihat dokumentasi resmi AutoCloseable dan catatan rilis Java 9 JEP 326.