2010-03-10 33 views
8

Chúng ta biết rằng không có vấn đề liệu một ngoại lệ được ném, hoặc bị bắt và xử lý nó, khối cuối cùng sẽ được thực hiện, Vì vậy, tôi đã tò mò rằng có bất kỳ khả năng cuối cùng khối sẽ không thực hiện.Có khả năng một khối cuối cùng có thể không thực thi không?

Và nếu System.exit() được gọi là thử hoặc bắt, thì cuối cùng cũng sẽ được gọi?

+8

Nếu bạn rút phích cắm của máy tính, khối cuối cùng sẽ không được thực thi. – Fortega

Trả lời

21

Nếu JVM thoát trong khi try hoặc catch đang được thực hiện, sau đó khối finally có thể không thực hiện. Tương tự như vậy, nếu chuỗi thực hiện mã try hoặc catch bị gián đoạn hoặc bị hủy, khối finally có thể không thực thi ngay cả khi ứng dụng vẫn tiếp tục.

Nguồn: java.sun.com: Java Tutorial: The finally Block

+1

lưu ý từ "có thể" ở đó. – Joset

3

Trong tài liệu Java:

http://java.sun.com/docs/books/tutorial/essential/exceptions/finally.html

Nó giải thích Cuối cùng rất tốt.

Họ lưu ý rằng nếu JVM thoát, khối cuối cùng sẽ không phải là được gọi. Hoặc nếu chuỗi đang chạy chặn mã bị hủy, khối cuối cùng sẽ không được gọi là không phải. Trong tất cả các trường hợp khác nó sẽ.

2

Một điều tôi có thể nghĩ ngay bây giờ là một OutOfMemoryError trong trường hợp này có một cơ hội mà không có mã hơn nữa trong ứng dụng của bạn có thể được thực thi.

+0

Ngay cả trong trường hợp của OutOfMemoryError, khối cuối cùng sẽ được thực hiện. Việc thực thi chính khối cuối cùng có thể sau đó tất nhiên gây ra một lỗi OutOfMemoryError, nhưng điều đó cũng có thể xảy ra, ngay cả khi khối thử đã hoàn tất thành công. – jarnbjo

6

System.exit() sẽ ngăn chặn một khối finally thực thi.

0

Nếu một số phương thức giao tiếp bản địa Java tách biệt (một hàm thư viện bên ngoài java nhưng được gọi từ đó), phương thức cuối cùng cũng sẽ không được gọi vì toàn bộ JVM dừng.

Lỗi trong bản thân JVM cũng dẫn đến sự cố và ngăn mọi thứ tiếp tục thực hiện.

1

System.exit (1); bạn có thể sử dụng

2
try { 
    System.out.println("BEFORE"); 
    System.exit(0); 
    System.out.println("AFTER"); 
} finally { 
    System.out.println("FINALLY"); 
} 

này sẽ cung cấp cho bạn kết quả:

BEFORE 
0

các khoản cuối cùng trong khối ngoại lệ try-catch luôn thực hiện, không phụ thuộc vào sự xuất hiện của ngoại lệ trong dòng chảy chương trình java bình thường. Nếu luồng thực hiện bị dừng trước mệnh đề cuối cùng thì khối cuối cùng sẽ không được thực thi.

chúng tôi có thể sử dụng System.exit(1); trước khi chặn và dừng luồng thực thi của chương trình.

Các vấn đề liên quan