■ 現象詳細
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 とは異なる ★
■ 調査で使用したコード
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