2010-08-14 24 views
13

Tôi đang nghiên cứu để thử nghiệm của tôi trong Object Oriented Programming và tôi đã tự hỏi nếu có bất kỳ trường hợp gì vậy bao giờ mà xem xét đoạn mã sau:Có trường hợp như vậy khi thử cuối cùng chặn cuối cùng sẽ không được thực hiện?

try { 
    do something 
} catch (someException e) { 

} finally { 
    do something 
} 

khối finally sẽ không thực hiện?

+13

Kéo phích cắm phải thực hiện. – PreciousBodilyFluids

+5

http://thedailywtf.com/Articles/My-Tales.aspx –

Trả lời

17

Có. Nếu bạn gặp sự cố máy ảo Java hoặc nói cách khác, hãy làm cho chương trình kết thúc, hoặc lặp/đợi vô hạn bên trong khối try.

Đó là ba trường hợp duy nhất sẽ tránh thực thi khối finally.

+3

Calling System.exit hoặc chuyển máy tính có thể được tính là "khiến chương trình chấm dứt" ... :-) –

+0

@Rasmus Kaj: Đồng ý. – Borealid

+0

Nếu trong khối thử, bạn quay trở lại từ hàm chứa cụm từ try/catch/finally này, khối cuối cùng vẫn sẽ thực thi? – euphoria83

5

Nếu bạn gọi System.exit(0) trong try. Hoặc làm một cái gì đó khiến JVM thoát hoặc treo (như bế tắc). Nếu không - không.

+0

JNI có lẽ có thể, mặc dù. –

2

Đặc tả ngôn ngữ Java guarantees mà cuối cùng được gọi trước khi câu lệnh thử hoàn tất.

Tuyên bố thử có thể không hoàn thành vì các lý do thông thường, đã được liệt kê trong câu trả lời của Borealid.

+1

"cuối cùng được gọi trước khi câu lệnh thử hoàn thành" ??? không nên "trước" là "khi" –

+2

Câu lệnh try- * * bao gồm khối try- * *, bất kỳ khối catch nào và tùy chọn khối cuối cùng. – meriton

0

Khối cuối cùng chắc chắn sẽ được thực hiện nếu điều khiển xuất phát từ thử hoặc khối catch. Nếu cho bạn một số cách quản lý để ngăn chặn sự kiểm soát để đi ra khỏi các khối:

  • bằng cách viết tuyên bố xuất cảnh, hoặc

  • vòng lặp vô hạn, vv

thì khối finally chí không được thực hiện. Nói chung, chúng tôi viết khối cuối cùng cho mục đích "dọn dẹp".

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