Trong lập trình Java, khối finally
và phương thức finalize()
đều liên quan đến việc xử lý ngoại lệ và quản lý tài nguyên, nhưng chúng có mục đích và cách thức hoạt động hoàn toàn khác nhau. Bài viết này sẽ phân tích chi tiết sự khác biệt giữa chúng, cách sử dụng và những điều cần lưu ý khi làm việc với cả hai.
Khối finally
là một phần của cấu trúc xử lý ngoại lệ trong Java. Nó luôn được thực thi sau khi khối try
và catch
kết thúc, bất kể có xảy ra ngoại lệ hay không. Điều này giúp đảm bảo rằng một số mã, thường là mã dọn dẹp tài nguyên, sẽ luôn được thực thi.
Khi bạn sử dụng khối try-catch
, khối finally
sẽ luôn được thực thi sau khi mã trong khối try
hoặc catch
kết thúc, như sau:
public class FinallyExample { public static void main(String[] args) { try { System.out.println("Inside try block"); int result = 10 / 0; // Sẽ ném ra ngoại lệ ArithmeticException } catch (ArithmeticException e) { System.out.println("Caught an exception: " + e); } finally { System.out.println("Finally block executed"); } } }
Output:
Inside try block Caught an exception: java.lang.ArithmeticException: / by zero Finally block executed
Trong ví dụ trên, dù có ngoại lệ xảy ra hay không, khối finally
vẫn được thực thi.
Khối finally
thường được sử dụng để:
Phương thức finalize()
là một phương thức được định nghĩa trong lớp java.lang.Object
. Nó được gọi bởi Garbage Collector trước khi một đối tượng bị thu gom rác, cho phép đối tượng thực hiện các thao tác dọn dẹp trước khi nó bị hủy.
Phương thức finalize()
được gọi tự động bởi Garbage Collector, không thể được gọi trực tiếp bởi lập trình viên. Dưới đây là một ví dụ về cách sử dụng finalize()
:
public class FinalizeExample { @Override protected void finalize() throws Throwable { try { System.out.println("Finalize method called"); } finally { super.finalize(); } } public static void main(String[] args) { FinalizeExample obj = new FinalizeExample(); obj = null; // Đặt đối tượng thành null để đánh dấu cho Garbage Collector System.gc(); // Gọi Garbage Collector } }
Output:
Finalize method called
Trong ví dụ này, khi đối tượng FinalizeExample
không còn được tham chiếu, phương thức finalize()
sẽ được gọi bởi Garbage Collector.
Phương thức finalize()
được sử dụng để:
try
hoặc catch
, ngay cả khi không có ngoại lệ xảy ra.Khối finally
và phương thức finalize()
đều có vai trò quan trọng trong quản lý tài nguyên và xử lý ngoại lệ trong Java, nhưng chúng có những mục đích và cách thức hoạt động khác nhau. Khối finally
giúp đảm bảo mã dọn dẹp luôn được thực thi, trong khi phương thức finalize()
cho phép đối tượng thực hiện dọn dẹp trước khi bị thu gom rác. Việc hiểu rõ sự khác biệt này sẽ giúp lập trình viên quản lý tài nguyên hiệu quả hơn trong ứng dụng Java.