เหตุใด Java จึงออกมาพร้อมกับความสำเร็จหลังจากข้อยกเว้นที่ไม่ได้ตรวจสอบ


24

เมื่อใดก็ตามที่โปรแกรม Perl, Python, C ++ หรือ Tcl หยุดทำงานโดยมีข้อยกเว้นที่ไม่สามารถจัดการได้ runtimes ภาษาเหล่านั้นจะลงทะเบียนรหัสทางออกที่ไม่เป็นศูนย์สำหรับกระบวนการ แม้แต่โปรแกรมที่ใช้ Eclipse ก็จะคืนค่า 1 หากมันล้มเหลวระหว่างการเริ่มต้น อย่างไรก็ตามโปรแกรมที่ดำเนินการตามมาตรฐานจะjava.exeกลับเป็นศูนย์อย่างมีความสุขไม่ว่าโปรแกรมจะจบลงอย่างกระทันหันเว้นแต่ว่าโปรแกรมนั้นเรียกใช้System.exit()ด้วยค่าการออก แม้กระทั่งAssertionFailedErrorหรือUnsatisfiedLinkErrorถูกรายงานกลับไปยังโปรแกรมการโทรให้ออกมาเป็นผลสำเร็จ

แน่นอนว่าไม่ใช่ทุกระบบที่มีรหัสส่งคืนโปรแกรม แต่ Unix และ Windows มีความสำคัญพอที่จะรับประกันjava.lang.Process.exitValue()กระบวนการลูก พวกเขาไม่รับประกันการเคารพแบบแผนสำหรับกระบวนการหลักหรือไม่

นี่เป็นข้อบกพร่องในการออกแบบภาษาหรือในการนำไปใช้หรือไม่? มีข้อโต้แย้งว่าเป็นความคิดที่ดีหรือไม่?


สงสัยว่าสิ่งนี้ไม่เหมาะกับ StackOverflow ... แค่มีความคิดเห็น
gablin

@gablin Mmm แน่นอนฉันเริ่มเขียนคำถามนี้ใน SO จากนั้นเปลี่ยนใจแล้วโพสต์ที่นี่
James

4
javaคำสั่งในJava 6และJava 7ทั้งสองดูเหมือนจะตอบสนองด้วยไม่ใช่ศูนย์รหัสทางออกถ้าข้อยกเว้น uncaught ถูกยกขึ้น
dimo414

คำตอบ:


28

หาก Java Language Specification ไม่ได้กำหนดค่าออกอย่างชัดเจนว่าจะเป็นเช่นนั้นจะไม่ได้กำหนดไว้และคุณไม่ควรเชื่อถือ

คุณต้องจับ Throwable ในวิธีการหลักของคุณและโทร System.exit (1) ด้วยตัวคุณเอง


8
ดังนั้นมันจึงเป็นข้อบกพร่องที่จะทำให้มันไม่ได้กำหนด?
James

3
อาจจะอาจจะไม่. สิ่งสำคัญเพียงอย่างเดียวคือสิ่งที่ JLS พูด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.