【トラブル】【Java】 Linux 上で、System.exit() に設定した値が process.waitFor() で受け取った時に値が異なる

■ 現象詳細

https://blogs.yahoo.co.jp/dk521123/37181766.html
のサンプルをLinux上で実行したところ、
System.exit() に設定した値が process.waitFor() で受け取った時に値が異なっていた。

なお、Windows上(Windows7/10 Java1.8.0)で確認したところ問題ないソースだった。

例:HTTPコード 407 の時

【ProxySettingChecker.java】
System.exit(407);

 ↓

【Main.java】(受け取り側)
int result = process.waitFor(); // ★ result = 145 で 設定した 407 とは異なる ★

■ 発生した環境

 * OS : Debian8
 * Java : Java1.8.0_65

■ 結論

System.exit() に設定する値は『0~255』の範囲に限る

■ 調査で使用したコード

SampleA.java

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SampleA {
  public static void main(String[] args) {
    for (int i = -300; i < 300; i++) {
      String value = String.valueOf(i);
      System.out.println("[" + value + "]");
      execute("java", "-jar", "SampleB.jar", value);
    }
  }
  
  private static void execute(String... commands) {
    ProcessBuilder processBuilder = new ProcessBuilder(commands);

    try {
      Process process = processBuilder.start();
      int result = process.waitFor();
      System.out.println("Result Code : " + result);
      if (result != 0) {
        System.err.println("Error!");
      }
      try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
        String line;
        while ((line = bufferedReader.readLine()) != null) {
          System.out.println(line);
        }
      }
      try (BufferedReader errorBufferedreader = new BufferedReader(new InputStreamReader(process.getErrorStream()))) {
        String errorLine;
        while ((errorLine = errorBufferedreader.readLine()) != null) {
          System.err.println(errorLine);
        }
      }
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

SampleB.java

SampleB.jar にする
public class SampleB {
  public static void main(String[] args) {
    int inputValue = Integer.valueOf(args[0]);
    System.out.println("inputValue : " + inputValue);
    System.exit(inputValue);
  }
}

実行結果(抜粋)

・・・
[-2]
Result Code : 254 ★NG★
inputValue : -2
[-1]
Result Code : 255 ★NG★
inputValue : -1
[0]
Result Code : 0 ☆OK☆
inputValue : 0
[1]
Result Code : 1 ☆OK☆
inputValue : 1
・・・
[255]
Result Code : 255 ☆OK☆
inputValue : 255
[256]
Result Code : 0 ★NG★
inputValue : 256
[257]
Result Code : 1 ★NG★
inputValue : 257

関連記事

Java】プロキシ設定のチェック機能を考える ~ その2 ~

https://blogs.yahoo.co.jp/dk521123/37181766.html

JavaJava から別のJava(JARファイル)を実行するには...

https://blogs.yahoo.co.jp/dk521123/37181644.html