あ、紛らわしい・・・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
お、こっちの方が分かりやすい。LinuxとWindowsの値の違いも載っている。
> java ExitCode 2; echo $?
2> java ExitCode 128; echo $?
128> java ExitCode 255; echo $?
255> java ExitCode 256; echo $?
0> java ExitCode 65536; echo $?
shell - ExitCodes bigger than 255, possible? - Stack Overflow
0
ちなみにこちらのWikipediaも参考に。
POSIX
As such, POSIX-compatible exit statuses are restricted to values 0-255, the range of an unsigned 8-bit integer.Windows
Exit status - Wikipedia
Windows uses 32-bit signed integers as exit codes
へーー、、、ShellとかWinバッチとかで実行後値を受け取って処理をするってのは注意だなぁ・・・特に開発マシンと本番マシンのOSが違う場合なんか。知らんかった。(イマサラ感)