Câu lệnh try-with-resources trong Java 7 là một câu lệnh try khai báo một hoặc nhiều tài nguyên. Tài nguyên là một đối tượng phải được đóng sau khi hoàn thành chương trình. Câu lệnh try-with-resources đảm bảo rằng mỗi tài nguyên được đóng sau khi thực thi câu lệnh.
Bạn có thể truyền bất kỳ đối tượng nào được implements java.lang.AutoCloseable, bao gồm tất cả các đối được implements java.io.Closeable.
Nội dung chính
Ví dụ 1 - try-with-resources
Ví dụ sau ghi một chuỗi vào một file. Nó sử dụng một thể hiện của đối tượng FileOutputStream để ghi dữ liệu vào file. FileOutputStream là một tài nguyên phải được đóng lại sau khi chương trình kết thúc. Vì vậy, trong ví dụ này, việc đóng tài nguyên được thực hiện bằng chính nó.
package vn.viettuts; import java.io.FileOutputStream; public class TryWithResources1 { public static void main(String args[]) { // su dung try-with-resources try (FileOutputStream fos = new FileOutputStream("/message1.txt")) { String msg = "Welcome to VietTuts.Vn!"; // converting string thanh mang byte byte byteArray[] = msg.getBytes(); fos.write(byteArray); System.out.println("Thong diep da duoc ghi vao file thanh cong!"); } catch (Exception exception) { System.out.println(exception); } } }
Kết quả:
Thong diep da duoc ghi vao file thanh cong!
Ví dụ 2 - try-with-resources - sử dụng nhiều resources
package vn.viettuts; import java.io.DataInputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; public class TryWithResources2 { public static void main(String[] args) { // su dung try-with-resources // su dung nhieu resources try (FileOutputStream fos = new FileOutputStream("/message2.txt"); InputStream is = new FileInputStream("/message2.txt")) { // ghi data vao file String msg = "Welcome to VietTuts.Vn!"; byte byteArray[] = msg.getBytes(); fos.write(byteArray); System.out.println("-------Data da duoc ghi vao file---------"); System.out.println(msg); // doc data tu file da ghi DataInputStream inst = new DataInputStream(is); int data = is.available(); byte[] byteArray2 = new byte[data]; // inst.read(byteArray2); String str = new String(byteArray2); System.out.println("-------Data read from file---------"); System.out.println(str); } catch (Exception exception) { System.out.println(exception); } } }
Kết quả:
-------Data da duoc ghi vao file--------- Welcome to VietTuts.Vn! -------Data read from file--------- Welcome to VietTuts.Vn!
Bạn có thể sử dụng khối catch với câu lệnh try-with-resources giống như một câu lệnh try thông thường.
Ví dụ 2 - try-with-resources - sử dụng khối lệnh finally
package vn.viettuts; import java.io.FileOutputStream; public class TryWithResources3 { public static void main(String args[]) { try (FileOutputStream fos = new FileOutputStream("/message3.txt")) { // ghi data vao file String msg = "Welcome to VietTuts.Vn!"; byte byteArray[] = msg.getBytes(); fos.write(byteArray); System.out.println("Data duoc ghi vao file thanh cong!"); } catch (Exception exception) { System.out.println(exception); } finally { System.out.println("Khoi lenh finally duoc thuc thi " + "sau khi dong resources."); } } }
Kết quả:
Data duoc ghi vao file thanh cong! Khoi lenh finally duoc thuc thi sau khi dong resources.
Các ngoại lệ bị loại bỏ
Nếu một khối try ném một ngoại lệ và một hoặc nhiều ngoại lệ được ném bởi try-with-resources, các ngoại lệ được ném bởi try-with-resources sẽ bị loại bỏ. Nói cách khác, chúng ta có thể nói, các ngoại lệ được ném bởi try-with-resources là các ngoại lệ bị loại bỏ.
Bạn có thể nhận được những ngoại lệ này bằng cách sử dụng phương thức getSuppress() của lớp Throwable.
Java đã thêm một hàm tạo mới và hai phương thức mới trong lớp Throwable để xử lý các ngoại lệ bị loại bỏ.
Constructor | Mô tả |
---|---|
protected Throwable (String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) | Nó xây dựng một đối tượng Throwable mới với các thông báo chi tiết được chỉ định, nguyên nhân, kích hoạt hoặc vô hiệu hóa, và có thể ghi stacktrace được kích hoạt hoặc vô hiệu hóa. |
Phương thức | Mô tả |
---|---|
public final void addSuppressed (Throwable exception) | Nó gắn thêm ngoại lệ được chỉ định cho các trường hợp ngoại lệ bị chặn để phân phối ngoại lệ này. Phương thức này là luồng an toàn và thường được gọi là (tự động và ngầm) bởi câu lệnh try-with-resources. Nó ném các ngoại lệ sau đây: IllegalArgumentException: nếu ngoại lệ có thể ném được, một phép ném không thể ngăn chặn chính nó. NullPointerException: nếu ngoại lệ là null. |
public final Throwable[] getSuppressed() | Nó trả về một mảng chứa tất cả các ngoại lệ đã bị chặn bởi câu lệnh try-with-resources. Nếu không có ngoại lệ nào bị chặn hoặc loại bỏ bị vô hiệu hóa, một mảng trống sẽ được trả về. |