2013-02-15 28 views
5

tôi đang làm việc trên My application's under maintanace moduleSystem.exit() kết quả unexecutable khối finally

try { 
    if (isUndermaintanace) { 
     System.exit(1); 
    } else { 
     prepareResources(); 
    }   
} catch (Exception e) { 
    printStack(e); 
} finally { 
    cleanResources(); 
} 

Khi tôi đi qua isundermaintanacetrue cuối cùng không thực hiện.

Tôi đang thiếu gì? Có cách nào khác để làm điều đó không?

+0

Có lẽ điều duy nhất bạn có thể làm là thay đổi 'System.exit (1)' để tắt ứng dụng của bạn theo một cách khác. –

Trả lời

15

Finally không thực hiện nếu bạn tiêu diệt VM (hoặc nếu VM chết theo cách khác). System.exit() là một phương pháp khá thô lỗ trong việc giết chết chương trình, trong khi cuối cùng là một khái niệm OOP cấp cao. System.exit() bails rất nhanh, làm càng ít dọn dẹp càng tốt.

Nếu bạn đã tham gia quản lý tác vụ và đã hủy quá trình hoặc phát hành kill -9 trong quá trình, bạn có mong đợi cuối cùng thực thi không? Đó là mơ hồ (rất mơ hồ) cùng một điều.


Có một vài điều đáng chú ý. Đặc biệt, tôi đã nói dối một chút trong phần đầu tiên của bài đăng. Thật là sai lầm khi so sánh System.exit() để thực sự ngay lập tức giết chết một chương trình. Đặc biệt, các móc tắt được chạy, và if configured, finalizers có thể thực sự được chạy. Tuy nhiên, lưu ý rằng các tài liệu khá mạnh mẽ đề xuất chống lại việc sử dụng runFinalizersOnExit.

+0

+1 cho câu đầu tiên. Thật là một cách thanh lịch để đặt nó. – corsiKa

+1

Nhưng còn 'cách nào khác để làm điều đó ?? '? – user000001

+0

@ user000001 Chỉ cần chỉnh sửa câu trả lời của tôi để giải quyết vấn đề đó. Lưu ý rằng cần chạy trình finalizer sau khi System.exit() là một dấu hiệu khá nghiêm trọng về thiết kế bị hỏng. – Corbin

1

Các chỉ trường hợp đặc biệt nơi khối finally sẽ không thực hiện được nếu bạn gọi 'System.exit (1)' trước khi finally block, đó là hành vi mong đợi như System.exit(1) sẽ chấm dứt JVM.

2

System.exit thoát khỏi chương trình ngay lập tức, bỏ qua bất kỳ việc thực thi mã nào khác (chẳng hạn như finally khối). Nếu bạn muốn thoát khỏi chương trình sau khi chạy các khối finally, hãy bỏ một ngoại lệ.

2

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

1

Nếu bạn gọi System.exit() mã của bạn sẽ không thực thi finally, vì cuộc gọi đó chấm dứt JVM của bạn.

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