Tại sao Java thoát với thành công sau một ngoại lệ chưa được phát hiện?


24

Bất cứ khi nào chương trình Perl, Python, C ++ hoặc Tcl tạm dừng với một ngoại lệ chưa được xử lý, các thời gian chạy ngôn ngữ đó sẽ cẩn thận để đăng ký mã thoát khác không cho quy trình. Ngay cả các chương trình dựa trên Eclipse cũng trả về 1 nếu chúng bị lỗi trong khi khởi động. java.exeTuy nhiên, các chương trình được chạy theo tiêu chuẩn , vui vẻ trả về 0 cho dù chúng kết thúc đột ngột như thế nào, trừ khi chương trình gọi System.exit()với giá trị thoát. Thậm chí AssertionFailedErrorhoặc UnsatisfiedLinkErrorđược báo cáo lại cho chương trình gọi là lối thoát thành công.

Tất nhiên không phải tất cả các hệ thống đều có mã trả về chương trình, nhưng Unix và Windows đủ quan trọng để đảm bảo java.lang.Process.exitValue()cho các quy trình con; Họ cũng không đảm bảo tôn trọng các quy ước cho các quy trình cha mẹ?

Đây có phải là một lỗ hổng trong thiết kế ngôn ngữ hay chỉ trong quá trình thực hiện? Có một lập luận rằng đó là một ý tưởng tốt?


Tự hỏi nếu điều này không phù hợp hơn trên StackOverflow ... Mặc dù vậy, chỉ là một ý kiến.
gablin

@gablin Mmm, thực sự tôi đã bắt đầu viết câu hỏi này trên SO sau đó đổi ý và đăng nó ở đây.
James

4
Cả hai javalệnh trong Java 6Java 7 dường như đáp ứng với mã thoát không bằng 0 nếu một ngoại lệ chưa được lưu được đưa ra.
dimo414

Câu trả lời:


28

Nếu Đặc tả ngôn ngữ Java không xác định rõ ràng giá trị thoát nào được mong đợi, thì nó không được xác định và bạn không nên dựa vào nó.

Bạn cần phải bắt throwable trong phương thức chính của mình và tự gọi System.exit (1).


8
Vì vậy, nó không phải là một thiếu sót để làm cho nó không xác định?
James

3
Co le không. Điều quan trọng duy nhất là những gì JLS nói.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.