JavaクラスがPOSTリクエストを作成し、それをサーブレットに送信します。クラスファイル(テスト)のメインメソッドは次のようになります。
public static void main(String[] args) throws IOException {
// Code logic goes here...
// No return Statement
}
これは、KornShell(ksh)スクリプトから次のように呼び出されます。
retcode=`$CLK_Java_PATH -cp $CLASSPATH test ${PASSWORD} ${HOSTNAME} ${TOOLSET}`
if [ $? != "0" ];then
echo "ERROR:
echo "${retcode}"
else
echo "${SCRIPT} Success"
fi
retcode
は、コードが失敗したか成功したかに関係なく、常に値「2」を持ちます。私の質問は、メインメソッドの戻り値の型が「void」であるため、コードが何らかの値を返すのはなぜですか?
Javaアプリケーションの戻り値はnotmain
メソッドであるため、 a Javaアプリケーションは、main
メソッドの実行が終了したときに必ずしも終了するわけではありません。
代わりに、デーモン以外のスレッドが実行されなくなったとき、または System.exit()
が呼び出されたときに、JVMは終了します。
また、戻り値を指定する唯一の方法はSystem.exit()
です。System.exit()
に渡された引数は、ほとんどのOSでJVMプロセスの戻り値として使用されます。
したがって、main()
メソッドを次のように終了します。
System.exit(0);
2つのことを保証します:
main
の終わりに達したときに実際に終了し、Javaプログラムは、CおよびC++で行われているように、main
から値を返すことによって終了コードをオペレーティングシステムに返しません。 System.exit(code);
を呼び出すことにより、プログラムを終了して終了コードを指定できます。次に例を示します。
// Returns exit code 2 to the operating system
System.exit(2);
System.exit(0);
これはエラーコード0を返します(すべてうまくいきました)。 System.exit Doc
使用する
System.exit( someNumber );
これにより、OSから見た戻り値をアプリで制御できるようになります。
プログラム常に終了後にリターンコードを返します。通常のプログラムでは、戻りコードを指定しないと、zeroが返されます(これには、戻り値の型をvoid
に設定することも含まれます)。
ただし、Javaは特別なものが好きです。 JavaはMainメソッドで返す戻りコードを返しませんが、JVMが終了すると(これはマルチスレッドプログラムを考慮します)、いくつかの戻りコードを返し、System.Exit(returnCode);
呼び出しで指定します。
終了ステータスが表示されません。これが$?
に含まれています。 System.out
に書き込まれるものは何でも、標準を取得しています。