argius note

プログラミング関連

System.exit()の使い方に注意

すごく今更で当たり前な話かも知れませんがメモ。
System.exit()は、シェルにリターンコードを返したりするのに使いますが、シェルから直接呼び出していない場合は、呼び出し元に戻すことができなくて困るので、どうしたら良いでしょうか。
私は、シェルから呼ばれる場合のエントリポイントは、APIとしてのエントリポイントと区別しています。つまり、APIとしてのエントリポイントから呼ばれた場合はSystem.exit()が実行されないようにしています。シェルから呼ばれる場合は、コマンド起動用のエントリポイントを使い、その中だけでSystem.exit()を使うようにします。

class CommandEntrance {
    public static void main(String[] args) {
        try {
            ApiEntrance.call();
            System.exit(0);
        } catch (RuntimeException ex) {
            System.err.println(ex.toString()); // stacktrace敢えて出さない
            System.exit(1);
        }
    }
}
public class ApiEntrance {
    public static void call() {
        // これからメソッドが終わるまでSystem.exit()は呼ばない
    }
}