arcanum_jp’s blog

おっさんの日記

JavaのSystem.exit( )の値はOSによって変わる?

あ、紛らわしい・・・JavaのSystem.exit()の結果そのものが変わるわけではありません。System.exit()を受けるシェルなりWinバッチなりが受ける値が変わるってことです。Javaの実行結果に限らんのでしょうけど。仕事中事象に出くわしたので・・・まぁこんなの知っている人にゃ知っているYO!なもんでしょうけど。初めて知ったのでめもめも・・・

class Hoge {
    public void main(String[] args){
        return System.exit(Integer.parseInt(args[0]));
    }
}

これ、単純に引数でもらった値をSystem.exit()するだけです。実行した値をコマンドで表示すると、取りうる値がこんな風に異なる。(linuxは$?、Windowsは%errorlevel%をエコーさせてみた)

linux windows
0 0 0
128 128 128
255 255 255
256 0 256
257 1 257

ほほーーー、、

Because in UNIX/POSIX, the exit code of a program is defined to be an unsigned 8-bit value. Converting -1 to unsigned 8-bit gives 255.

shell - Why do I get error 255 when returning -1 - Unix & Linux Stack Exchange

お、こっちの方が分かりやすい。LinuxWindowsの値の違いも載っている。

> java ExitCode 2; echo $?
2

> java ExitCode 128; echo $?
128

> java ExitCode 255; echo $?
255

> java ExitCode 256; echo $?
0

> java ExitCode 65536; echo $?
0

shell - ExitCodes bigger than 255, possible? - Stack Overflow

 ちなみにこちらのWikipediaも参考に。

POSIX
As such, POSIX-compatible exit statuses are restricted to values 0-255, the range of an unsigned 8-bit integer.

Windows
Windows uses 32-bit signed integers as exit codes

Exit status - Wikipedia

へーー、、、ShellとかWinバッチとかで実行後値を受け取って処理をするってのは注意だなぁ・・・特に開発マシンと本番マシンのOSが違う場合なんか。知らんかった。(イマサラ感)