web-dev-qa-db-ja.com

Javaコードからの戻り値

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」であるため、コードが何らかの値を返すのはなぜですか?

21
Monojeet

Javaアプリケーションの戻り値はnotmainメソッドであるため、 a Javaアプリケーションは、mainメソッドの実行が終了したときに必ずしも終了するわけではありません。

代わりに、デーモン以外のスレッドが実行されなくなったとき、または System.exit() が呼び出されたときに、JVMは終了します。

また、戻り値を指定する唯一の方法はSystem.exit()です。System.exit()に渡された引数は、ほとんどのOSでJVMプロセスの戻り値として使用されます。

したがって、main()メソッドを次のように終了します。

System.exit(0);

2つのことを保証します:

  • Javaアプリケーションは、mainの終わりに達したときに実際に終了し、
  • jVMプロセスの戻り値が0であること
45
Joachim Sauer

Javaプログラムは、CおよびC++で行われているように、mainから値を返すことによって終了コードをオペレーティングシステムに返しません。 System.exit(code);を呼び出すことにより、プログラムを終了して終了コードを指定できます。次に例を示します。

// Returns exit code 2 to the operating system
System.exit(2);
18
Jesper
System.exit(0);

これはエラーコード0を返します(すべてうまくいきました)。 System.exit Doc

6
Jacob

使用する

System.exit( someNumber );

これにより、OSから見た戻り値をアプリで制御できるようになります。

4
djna

プログラム常に終了後にリターンコードを返します。通常のプログラムでは、戻りコードを指定しないと、zeroが返されます(これには、戻り値の型をvoidに設定することも含まれます)。

ただし、Javaは特別なものが好きです。 JavaはMainメソッドで返す戻りコードを返しませんが、JVMが終了すると(これはマルチスレッドプログラムを考慮します)、いくつかの戻りコードを返し、System.Exit(returnCode);呼び出しで指定します。

3
foxy

終了ステータスが表示されません。これが$?に含まれています。 System.outに書き込まれるものは何でも、標準を取得しています。