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()は呼ばない } }