システムの違い。Javaのexit(0)、System.exit(-1)、System.exit(1)


280

Javaで次の違いを知りたい

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

上記のコードをいつ適切に使用する必要がありますか?


17
回答を「ベストアンサー」としてマークしなかったので、緑色のチェックマークが付いていますか?それは他の人が最高のものを知っているのに役立ちます!!
Saksham Goyal 2016

回答:


252

exitのパラメータは、プログラムの実行が成功したか失敗したかを示します。これは、何かがおかしいのか、何がおかしいのかを知るのに役立つ、古いプログラミング言語の一種の遺伝です。

終了コードは

  • 0 実行がうまくいったとき
  • 1-1whatever != 0いくつかのエラーが発生したとき、あなたはエラーの異なる種類の異なる値を使用することができます。

私が正しい場合、以前は正の数(UNIXでは)で、範囲に応じた終了コードを使用していました。

  • 1-127ユーザー定義コードです(したがって、を呼び出すことによって生成されますexit(n)
  • 128-255SIGSEGVSIGTERMなどのさまざまなUNIX信号が原因で終了して生成されるコード

しかし、Javaでコーディングするときに気にする必要はないと思います。これはほんの少しの情報です。プログラムを標準ツールと相互作用させる場合に便利です。


31
また、シェルでは、終了コード0はtrueとしてカウントされ、その他のコードはfalseとしてカウントされます。したがってjava MyApp && echo success、MyAppが0の終了コードを持っている場合、つまりexit(0)、エラーが発生することなく、メインメソッドの最後を呼び出すか単に終了した場合に、「成功」を出力します。
sepp2k 2010年

16
アプリをスクリプトで使用できる場合は、常に終了コードに注意してください。スクリプトの途中でツールが静かに失敗する(または、スタックトレースを出力して0で終了する)ことは、非常に煩わしいことです。
ドンチョグンシェフ2014年

6
注意すべき点の1つ:-1を返す場合、可能な最大の正の数が符号なしのコンテキストで返されます(2の補数表現では、-1は常に数のバイト数に関係なくすべてのビットを設定します)。したがって、通常、非特定のエラーを返し、すでに定義および文書化されている可能性のあるエラーコードと競合しないようにするには、-1が返されます。たとえば、エラーコード1は書き込みエラーとして文書化されている可能性があります。エラーコード2が等、読み出しエラーであるかもしれない
ナイロンスマイル

これは実際にはUnixの* exit(2) `からの「一種の遺伝」です。
ローンズオブローン

127

Zero =>すべて大丈夫

Positive =>私が予想していた問題が潜在的に失敗する可能性があります(コマンドラインが不良、ファイルが見つからない、サーバーに接続できない)

Negative=>まったく予期していなかった問題が発生しました(システムエラー-予期しない例外-外部から強制終了などkill -9

(8ビットの符号付きバイナリ、または2の補数と見なすと、128より大きい値は実際には負になります)

ここにはたくさんの良い標準の終了コードがあります


12
「私がうまくいくと思っていた何かがうまくいかなかった」というのは「すべて大丈夫」のように聞こえます。
2014年

「私が開発者として期待することが合理的に期待できること」ユーザーエラーとシステムエラー。これは実際には上位のポスターで覆われています。値128〜255は-ve wrt 8ビットの符号付きバイナリです。
ロバート

6
@tobeそれは本当に「もっとうまくいくと思っていた何かが実際にうまくいかなかった」のようなものです;)
マルセルヘルナンデス

1
Bashは終了コードを8ビットの符号なしとして扱い、256をmodするため、-1は255になり、256は0になります。シグナル(killなどkill -15)はしばしば終了コード128+signalになりますが、(9を除いて)処理でき、別の終了コードを返します。-中にはkill -15、信号ではなく、PIDとしてマーク番号である、それは信号の否定をしません。
マシュー

あなたが行う場合には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

終了コード-1がエラーを表すことはJava docで言及されていませんが、代わりに「ステータス-終了ステータス。慣例により、ゼロ以外のステータスコードは異常終了を示します。」
Damith 2018

EXIT_*Javaには存在しません。
ジャンキト


6

exit(0)通常、正常終了を示すために使用されます。exit(1)またはexit(-1)その他のゼロ以外の値は、一般に終了が失敗したことを示します。


引数がコーダーによって渡されたのは私を混乱させるものです。メソッドによる戻り値ではありません。終了結果をどのように示すことができますか?
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

255を超えるエラーコードはエラーコード%256に変換されます。カスタムエラーコード> 255を使用していて、アプリケーションロジックで正確なエラーコードを期待している場合は、特に注意が必要です。 http://www.tldp.org/LDP/abs/html/exitcodes.html


1

system.exit()に入力された数値の違いは、他の回答で説明されています。実際の違いは、System.exit()が呼び出しプロセスに返されるコードであることです。プログラムがオペレーティングシステムによって呼び出されている場合、戻りコードは、system.exit()が0を返した場合、すべてが問題ないことをOSに通知しますが、何か問題がなければ、親プロセスにそのハンドラーが存在する可能性があります


0

他の人が0成功の意味に答えるように、そうでなければ。

batファイル(ウィンドウ)を使用している場合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) -何らかのエラーのために終了できなかったことを意味します


引数は常に「ステータスコードとして機能します」。それがゼロのときだけではありません。
侯爵のローン

そうそう。すみません、私の悪いEJP
アンドロミノール2017年

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

}

上記のコードでは、System.exit(0); ケース5を押すと適切に終了しますが、System.exit(1)を使用すると、そして、ケース5を押すとエラーで終了し、ケース15で試すと正しく終了します。これにより、引数の内部にintを置くと、その位置から文字が取得されることがわかります。つまり、 (4)その文字列から5番目の文字を取得することを意味します(3)場合、その入力文字列から4番目の文字を取得することを意味します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.