ความแตกต่างในระบบ exit (0), System.exit (-1), System.exit (1) ใน Java


280

ฉันต้องการทราบความแตกต่างระหว่างสิ่งต่อไปนี้ใน Java

System.exit(0);
System.exit(-1);
System.exit(1);

ฉันต้องใช้รหัสด้านบนเมื่อใด


17
ทำไมคุณไม่ทำเครื่องหมายคำตอบว่า 'คำตอบที่ดีที่สุด' ดังนั้นจึงมีเห็บสีเขียว มันช่วยให้คนอื่นรู้ว่าอะไรดีที่สุด !!
Saksham Goyal

คำตอบ:


252

พารามิเตอร์ของ exit ควรมีคุณสมบัติถ้าการทำงานของโปรแกรมดีหรือไม่ดี มันเป็นลักษณะทางพันธุกรรมจากภาษาการเขียนโปรแกรมแบบเก่าซึ่งมีประโยชน์ที่จะทราบว่ามีบางอย่างผิดปกติหรือผิดพลาด

รหัสออกคือ

  • 0 เมื่อการดำเนินการเป็นไปด้วยดี;
  • 1, -1, whatever != 0เมื่อเกิดข้อผิดพลาดบางอย่างเกิดขึ้นคุณสามารถใช้ค่าที่แตกต่างกันสำหรับชนิดที่แตกต่างกันของข้อผิดพลาด

หากฉันแก้ไขรหัสทางออกที่ใช้เป็นเพียงตัวเลขบวก (ฉันหมายถึงเป็น UNIX) และตามช่วง:

  • 1-127เป็นรหัสที่ผู้ใช้กำหนด (สร้างโดยการโทรexit(n))
  • 128-255เป็นรหัสที่สร้างขึ้นโดยการยกเลิกเนื่องจากสัญญาณยูนิกซ์ที่แตกต่างกันเช่นSIGSEGVหรือSIGTERM

แต่ฉันไม่คิดว่าคุณควรใส่ใจในขณะที่เขียนโค้ดบน Java มันเป็นเพียงข้อมูลเล็กน้อย มีประโยชน์ถ้าคุณวางแผนที่จะให้โปรแกรมของคุณโต้ตอบกับเครื่องมือมาตรฐาน


31
นอกจากนี้โปรดทราบว่ารหัสการออกเป็น 0 ถือว่าเป็นจริงในเชลล์และรหัสอื่นใดนับว่าเป็นเท็จ ดังนั้นjava MyApp && echo successจะพิมพ์ "สำเร็จ" iff MyApp มีรหัสการออกเป็น 0 นั่นคือถ้ามันเรียกexit(0)หรือถึงจุดสิ้นสุดของวิธีการหลักโดยไม่มีข้อผิดพลาด
sepp2k

16
โปรดระวังรหัสทางออกเสมอหากแอปของคุณสามารถใช้งานได้ในสคริปต์ เป็นเรื่องที่น่ารำคาญมากที่เครื่องมือไม่ทำงานเงียบ ๆ ระหว่างสคริปต์ของคุณ (หรือพิมพ์สแต็กการติดตามและออกด้วย 0)
Doncho Gunchev

6
สิ่งหนึ่งที่ควรทราบ: เมื่อส่งกลับ -1 จำนวนบวกที่ใหญ่ที่สุดที่เป็นไปได้จะถูกส่งกลับในบริบทที่ไม่ได้ลงนาม (ในการแสดงส่วนประกอบสองของ -1 จะกำหนดบิตทั้งหมดโดยไม่คำนึงถึงจำนวนไบต์ในจำนวน) ดังนั้นโดยปกติแล้ว -1 จะถูกส่งกลับเมื่อคุณส่งคืนข้อผิดพลาดที่ไม่เฉพาะเจาะจงและไม่ต้องการให้ขัดแย้งกับรหัสข้อผิดพลาดที่เป็นไปได้ที่กำหนดไว้แล้วและบันทึกไว้ เช่นรหัสข้อผิดพลาด 1 อาจถูกบันทึกเป็นข้อผิดพลาดในการเขียน; รหัสข้อผิดพลาด 2 อาจเป็นข้อผิดพลาดในการอ่าน ฯลฯ
Nylon Smile

มันเป็น 'การเรียงลำดับของพันธุกรรม' จากทางออกของ Unix * (2) `ที่จริงแล้ว
มาร์ควิสแห่ง Lorne

127

Zero => ทุกอย่างโอเค

Positive => บางสิ่งที่ฉันคาดว่าอาจผิดพลาดเกิดข้อผิดพลาด (บรรทัดคำสั่งไม่ถูกต้องไม่พบไฟล์ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์)

Negative=> บางสิ่งที่ฉันไม่ได้คาดว่าจะเกิดความผิดพลาด (ข้อผิดพลาดของระบบ - ข้อยกเว้นที่ไม่คาดคิด - การบังคับจากภายนอกเช่นkill -9)

(ค่าที่มากกว่า 128 เป็นค่าลบจริง ๆ ถ้าคุณคิดว่ามันเป็นเลขฐานสองที่ลงนาม 8 บิตหรือส่วนเติมเต็มสองครั้ง)

มีรหัสทางออกมาตรฐานที่ดีมากมายที่นี่


12
"บางสิ่งที่ฉันคาดว่าจะผิดพลาดไปผิด" เสียงเหมือน "ทุกอย่างโอเค"
tobe

"สิ่งที่ฉันในฐานะนักพัฒนาคาดว่าจะสามารถคาดการณ์ได้อย่างสมเหตุสมผล" ข้อผิดพลาดของผู้ใช้กับข้อผิดพลาดของระบบ นี่คือความจริงที่ครอบคลุมโดยผู้โพสต์ชั้นนำ: ค่า 128-255 เป็น -ve wrt 8 บิตลงนามไบนารี
เบิร์ต

6
@tobe มันเหมือนจริง ๆ "สิ่งที่ฉันคาดหวังว่าจะผิดพลาดจริง ๆ แล้วผิดพลาด";)
Marcel Hernandez

1
Bash ถือว่ารหัสการออกเป็น 8 บิตที่ไม่ได้ลงชื่อและจะ mod 256 ดังนั้น -1 กลายเป็น 255 และ 256 กลายเป็น 0 สัญญาณ (ในการฆ่าเช่นkill -15) มักจะส่งผลให้รหัสออก128+signalแต่ (นอกเหนือจาก 9) สามารถจัดการและ ส่งคืนรหัสทางออกอื่น -ในkill -15เป็นเครื่องหมายตัวเลขเป็นสัญญาณและไม่ pid ก็ไม่ได้ทำให้สัญญาณเชิงลบ
Matthew

เมื่อคุณทำSystem.exit(-1)แล้วในเปลือกecho $?คุณจะได้รับ '255' นี่คือเหตุผลที่ฉันพูดว่าจำนวนลบเป็นข้อผิดพลาดของระบบไม่ใช่เพราะ '-' ในพารามิเตอร์ kill คุณคิดอย่างจริงจังว่าเป็นสิ่งที่ฉันคิดหรือไม่ แต่ขอบคุณที่อธิบายกลไกที่ Bash สร้างรหัสเหล่านี้
เบิ

51

System.exit(system call)ยุติการทำงานของเครื่องเสมือน Java ที่กำลังรันอยู่โดยเริ่มต้นลำดับการปิดเครื่อง อาร์กิวเมนต์ที่ทำหน้าที่เป็นรหัสสถานะ

โดยการประชุมรหัสสถานะที่ไม่ใช่ศูนย์บ่งชี้ว่าการเลิกจ้างที่ผิดปกติ

  System.exit(0) or EXIT_SUCCESS;  ---> Success
  System.exit(1) or EXIT_FAILURE;  ---> Exception
  System.exit(-1) or EXIT_ERROR;   ---> Error

อ่านเพิ่มเติมได้ที่ Java

บนระบบ Unix และ Linux 0สำหรับการประมวลผลที่สำเร็จและ1สูงกว่าสำหรับการประมวลผลที่ล้มเหลว


3
คำตอบนี้ดูเหมือนจะขัดแย้งกับคำตอบของ @ robert
amdev

ไม่ได้กล่าวถึงในเอกสาร java ที่รหัสทางออก -1 แสดงถึงข้อผิดพลาดแทนถ้อยคำคือ "สถานะ - สถานะการเลิกจ้างตามระเบียบการประชุมรหัสสถานะที่ไม่ใช่ศูนย์บ่งชี้ถึงการเลิกจ้างที่ผิดปกติ"
Damith

EXIT_*ไม่มีอยู่ใน Java
juanchito

11

รหัสสถานะทางออกที่ไม่ใช่ศูนย์มักจะบ่งบอกถึงการเลิกจ้างที่ผิดปกติ ถ้าn != 0มันขึ้นอยู่กับโปรแกรมเมอร์ที่จะใช้ความหมายกับ n ต่างๆ

จากhttps://docs.oracle.com/javase/7/docs/api/java/lang/System.html


6

exit(0)โดยทั่วไปใช้เพื่อบ่งชี้ถึงการยกเลิกที่ประสบความสำเร็จ exit(1)หรือexit(-1)หรือค่าที่ไม่เป็นศูนย์อื่น ๆ บ่งชี้ถึงการเลิกจ้างที่ไม่สำเร็จโดยทั่วไป


cofuse me คืออะไรอาร์กิวเมนต์ถูกส่งผ่านโดย coder ไม่คืนค่าโดยวิธีมันจะบ่งบอกถึงผลการเลิกจ้างได้อย่างไร
anKotliner

4

นี่คือคำตอบ

System.exit(0);// normal termination - Successful - zero
System.exit(-1);//Exit with some Error
System.exit(1);//one or any positive integer // exit with some Information message

2

gotcha ที่ดีคือรหัสข้อผิดพลาดใด ๆ > 255 จะถูกแปลงเป็นรหัสข้อผิดพลาด% 256 หนึ่งควรระมัดระวังเป็นพิเศษเกี่ยวกับเรื่องนี้ถ้าพวกเขากำลังใช้รหัสข้อผิดพลาดที่กำหนดเอง> 255 และคาดว่ารหัสข้อผิดพลาดที่แน่นอนในตรรกะของโปรแกรมประยุกต์ http://www.tldp.org/LDP/abs/html/exitcodes.html


1

ความแตกต่างของตัวเลขที่ใส่ใน system.exit () ถูกอธิบายในคำตอบอื่น ๆ แต่ความแตกต่างที่แท้จริงคือ System.exit () เป็นรหัสที่กลับสู่กระบวนการเรียกใช้ หากโปรแกรมกำลังถูกเรียกใช้โดยระบบปฏิบัติการแล้วโค้ดส่งคืนจะแจ้งให้ระบบปฏิบัติการทราบว่าหาก system.exit () คืนค่า 0 มากกว่าทุกอย่างก็โอเค แต่ถ้าไม่ใช่สิ่งที่ผิดพลาดอาจมีตัวจัดการบางตัวสำหรับกระบวนการหลัก


0

ในขณะที่คนอื่นตอบ0ความหมายความสำเร็จเป็นอย่างอื่น

หากคุณใช้ไฟล์ค้างคาว (หน้าต่าง) System.exit(x)จะมีผล

รหัส java (myapp):

if (error < 2){
    help();
    System.exit(-1);    
}
else{
    doSomthing();
    System.exit(0);
}

}

ไฟล์ค้างคาว:

java -jar myapp.jar
if %errorlevel% neq 0 exit /b %errorlevel%
rem -- next command if myapp is success --

-2

System.exit (0) โดยการประชุมรหัสสถานะที่ไม่ใช่ศูนย์บ่งชี้ว่าการเลิกจ้างที่ผิดปกติ

System.exit (1) - หมายถึงการยกเลิกไม่สำเร็จเนื่องจากข้อผิดพลาดบางอย่าง


อาร์กิวเมนต์ 'ทำหน้าที่เป็นรหัสสถานะ' เสมอ ไม่ใช่แค่เมื่อมันเป็นศูนย์
มาร์ควิสแห่ง Lorne

โอ้ใช่ . ขอโทษ EJP ที่ไม่ดีของฉัน
androminor

-7
class calc{
public static void main(String args[])
{
    int a, b, c;
    char ch;
    do{

        Scanner s=new Scanner(System.in);

                System.out.print("1. Addition\n");
                System.out.print("2. Substraction\n");
                System.out.print("3. Multiplication\n");
                System.out.print("4. Division\n");
                System.out.print("5. Exit\n\n");

                System.out.print("Enter your choice : ");
                ch=s.next().charAt(0);
                    switch (ch)
                    {
                        case '1' :
                        Addition chose1=new Addition();
                        chose1.add();
                        break;

                        case '2' :
                        Substraction chose2=new Substraction();
                        chose2.sub();
                        break;

                        case '3' :
                        Multiplication chose3= new Multiplication();
                        chose3.multi();
                        break;

                        case '4' :
                        Division chose4=new Division();
                        chose4.divi();
                        break;

                        case '5' :
                        System.exit(0);
                        break;

                        default :
                        System.out.print("wrong choice!!!");
                        break;
                    }
        System.out.print("\n--------------------------\n");                     
    }while(ch !=5); 
}

}

ในรหัสข้างต้นเมื่อ System.exit (0); และเมื่อฉันกด 5 กรณีมันออกอย่างถูกต้อง แต่เมื่อฉันใช้ System.exit (1); และกด case 5 มันออกมาพร้อมกับ error และอีกครั้งเมื่อฉันลองกับ case 15 มันจะออกอย่างถูกต้องโดยสิ่งนี้ฉันได้รู้ว่าเมื่อเราใส่ int ภายในอาร์กิวเมนต์มันระบุว่ามันใช้ตัวละครจากตำแหน่งนั้นถ้าฉันใส่ (4) หมายถึงใช้อักขระตัวที่ 5 จากสตริงนั้นถ้า (3) หมายถึงใช้อักขระตัวที่ 4 จากสตริงที่ป้อน

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