Sự khác biệt trong hệ thống. thoát (0), System.exit (-1), System.exit (1) trong Java


280

Tôi muốn biết sự khác biệt giữa các điều sau trong Java

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

Khi nào tôi phải sử dụng mã trên một cách thích hợp?


17
Tại sao bạn không đánh dấu câu trả lời là 'câu trả lời hay nhất' để có dấu tích màu xanh lá cây? nó giúp người khác biết cái tốt nhất là gì !!
Saksham Goyalty

Câu trả lời:


252

Tham số thoát phải đủ điều kiện nếu việc thực hiện chương trình diễn ra tốt hay xấu. Đó là một loại di truyền từ các ngôn ngữ lập trình cũ hơn, nơi hữu ích để biết nếu có sự cố và điều gì sai.

Mã thoát là

  • 0 khi thực hiện đã ổn
  • 1, -1, whatever != 0Khi một số lỗi xảy ra, bạn có thể sử dụng giá trị khác nhau cho các loại lỗi khác nhau.

Nếu tôi đúng mã thoát được sử dụng chỉ là số dương (ý tôi là trong UNIX) và theo phạm vi:

  • 1-127là các mã do người dùng xác định (do đó được tạo bằng cách gọi exit(n))
  • 128-255là các mã được tạo bởi chấm dứt do các tín hiệu unix khác nhau như SIGSEGV hoặc SIGTERM

Nhưng tôi không nghĩ bạn nên quan tâm trong khi mã hóa trên Java, đó chỉ là một chút thông tin. Thật hữu ích nếu bạn có kế hoạch làm cho các chương trình của bạn tương tác với các công cụ tiêu chuẩn.


31
Cũng lưu ý rằng mã thoát 0 được tính là đúng trong trình bao và bất kỳ mã nào khác được tính là sai. Vì vậy, java MyApp && echo successsẽ in "thành công" iff MyApp có mã thoát là 0, tức là nếu nó gọi exit(0)hoặc đơn giản là đến cuối phương thức chính mà không gặp lỗi.
sepp2k

16
Xin vui lòng, luôn quan tâm đến mã thoát nếu ứng dụng của bạn có thể được sử dụng trong tập lệnh. Sẽ rất khó chịu khi có một công cụ thất bại âm thầm ở giữa tập lệnh của bạn (hoặc in một số dấu vết ngăn xếp và thoát bằng 0).
Doncho Gunchev

6
Một điều cần lưu ý: khi trả về -1, số dương lớn nhất có thể được trả về trong ngữ cảnh không dấu (trong biểu diễn bổ sung của hai -1 luôn đặt tất cả các bit bất kể số byte trong số đó là bao nhiêu). Vì vậy, -1 thường được trả về khi bạn trả về một lỗi không cụ thể và không muốn nó xảy ra xung đột với các mã lỗi có thể đã được xác định và ghi lại. ví dụ mã lỗi 1 có thể đã được ghi nhận là lỗi ghi; mã lỗi 2 có thể là lỗi đọc, v.v.
Nụ cười của nylon

Đó thực sự là một 'loại di truyền' từ lối ra * của Unix (2).
Hầu tước Lorne ngày

127

Zero => Mọi thứ đều ổn

Positive => Một cái gì đó tôi mong đợi có thể có khả năng đã đi sai (dòng lệnh xấu, không thể tìm thấy tệp, không thể kết nối với máy chủ)

Negative=> Một cái gì đó tôi không mong đợi đã xảy ra (lỗi hệ thống - ngoại lệ không lường trước được - chấm dứt cưỡng bức bên ngoài, ví dụ kill -9)

(các giá trị lớn hơn 128 thực sự là âm, nếu bạn coi chúng là nhị phân có chữ ký 8 bit hoặc bổ sung twos)

Có rất nhiều mã thoát tiêu chuẩn tốt ở đây


12
"Một cái gì đó tôi dự đoán là đã đi sai" nghe như "Mọi thứ đều ổn".
tobe

"Những điều mà tôi với tư cách là nhà phát triển có thể dự kiến ​​một cách hợp lý để lường trước" Lỗi người dùng so với lỗi hệ thống; Điều này thực sự được bao phủ bởi poster hàng đầu: các giá trị 128-255 được ghi là nhị phân 8 bit có chữ ký.
robert

6
@tobe Nó thực sự giống như "Một cái gì đó tôi mong đợi có thể đã đi sai thực sự sai";)
Marcel Hernandez

1
Bash coi các mã thoát là không dấu 8 bit và sẽ sửa đổi 256, do đó -1 trở thành 255 và 256 trở thành 0. Tín hiệu (trong một lệnh giết, ví dụ kill -15) thường dẫn đến mã thoát 128+signal, nhưng (ngoài 9) có thể được xử lý và trả về một mã thoát khác Các -trong kill -15được đánh dấu số là một tín hiệu và không phải là một pid, nó không làm cho tín hiệu tiêu cực.
Matthew

Khi bạn làm System.exit(-1)và sau đó trong vỏ của echo $?bạn, bạn nhận được '255'. Đây là lý do tại sao tôi nói số âm là lỗi hệ thống, không phải do '-' trong tham số kill. Bạn có nghiêm túc nghĩ rằng đó là những gì tôi nghĩ? Nhưng cảm ơn bạn đã giải thích cơ chế mà Bash xây dựng các mã này.
robert

51

System.exit(system call)chấm dứt máy ảo Java hiện đang chạy bằng cách khởi tạo chuỗi tắt máy của nó. Đối số phục vụ như một mã trạng thái .

Theo quy ước, một mã trạng thái khác không cho thấy sự chấm dứt bất thường.

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

Đọc thêm tại Java

Trên các hệ thống Unix và Linux, 0cho các lần thực hiện thành công và 1cao hơn cho các lần thực hiện không thành công.


3
Câu trả lời này có vẻ mâu thuẫn với câu trả lời của @ robert
amdev

Nó đã không được đề cập trong tài liệu java rằng mã thoát -1 đại diện cho ERROR thay vì từ ngữ là "trạng thái - Trạng thái chấm dứt. Theo quy ước, mã trạng thái khác không biểu thị chấm dứt bất thường."
Damith

EXIT_*không tồn tại trong Java.
juanchito


6

exit(0)thường được sử dụng để chỉ ra chấm dứt thành công. exit(1)hoặc exit(-1)bất kỳ giá trị khác không nào khác cho thấy việc chấm dứt không thành công nói chung.


Điều gì cho tôi biết là đối số được truyền bởi bộ mã hóa. Không phải là giá trị trả về của phương thức. Làm thế nào nó có thể chỉ ra kết quả chấm dứt?
anKotliner

4

Đây là câu trả lời.

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

Một mã xác thực tốt là bất kỳ mã lỗi nào> 255 sẽ được chuyển đổi thành mã lỗi% 256. Người ta phải đặc biệt cẩn thận về vấn đề này nếu họ đang sử dụng mã lỗi tùy chỉnh> 255 và mong đợi mã lỗi chính xác trong logic ứng dụng. http://www.tldp.org/LDP/abs/html/exitcodes.html


1

sự khác biệt của các số được đặt trong system.exit () được giải thích trong các câu trả lời khác. nhưng SỰ KHÁC BIỆT THỰC SỰ là System.exit () là một mã được trả về quy trình gọi. Nếu chương trình đang được hệ điều hành gọi thì mã trả về sẽ báo cho HĐH rằng nếu system.exit () trả về 0 thì mọi thứ đều ổn nhưng nếu không có gì sai, thì có thể có một số trình xử lý cho quy trình cha


0

Như những người khác trả lời 0có nghĩa là thành công, nếu không.

Nếu bạn sử dụng tập tin bat (cửa sổ) System.exit(x)sẽ có hiệu lực.

Mã java (myapp):

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

}

tập tin dơi:

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

-2

System.exit (0) theo quy ước, mã trạng thái khác không cho biết chấm dứt bất thường.

System.exit (1) -Nó có nghĩa là chấm dứt không thành công do một số lỗi


Đối số luôn luôn 'phục vụ như một mã trạng thái'. Không chỉ khi nó bằng không.
Hầu tước Lorne ngày

ồ vâng xin lỗi EJP xấu của tôi
androminor

-6
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); 
}

}

Trong đoạn mã trên khi System.exit (0) của nó; và khi tôi nhấn case 5 thì nó thoát đúng nhưng khi tôi sử dụng System.exit (1); và nhấn case 5 nó thoát với lỗi và một lần nữa khi tôi thử với case 15 nó thoát đúng bằng cách này tôi đã biết rằng, khi chúng ta đặt bất kỳ int int nào trong đối số, nó chỉ định rằng, nó lấy ký tự từ vị trí đó tức là nếu tôi đặt (4) có nghĩa là lấy ký tự thứ 5 từ chuỗi đó nếu (3) thì có nghĩa là lấy ký tự thứ 4 từ chuỗi được nhập đó

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.