プログラムが開始されたかどうかを確認して、-ea
そうでない場合に終了/失敗できるようにする方法はありますか? アサーションが失敗した場合は、それについて通知を受けたいです。したがって、これなしで起動するのは致命的なエラーだと思います。
3 に答える
失敗することが保証されたアサーションを作成します。
そのアサーションの後のコードが実行された場合、アサーションは有効になっていません。
boolean asserted = false;
try {
assert false;
} catch (AssertionError e) {
asserted = true;
}
if (!asserted) {
System.err.println("Missing '-ea' flag; exiting.");
System.exit(1);
// ... or throw a RuntimeException, depending on your environment.
}
とはいえ、アサーションを強制することは素晴らしいアイデアだと100%確信しているわけではありません。IMOアサーションは、通常のエラーチェック/処理ではなく、開発用です。
public static void main(String[] args) {
boolean ok = true;
try {
assert false;
ok = false;
} catch (AssertionError ex) {
}
if (!ok) {
System.err.println("FATAL: assertions are not enabled.\n");
System.exit(1);
}
}
これは、実際に副作用のあるアサーションが必要な場合のまれなケースです。これは通常、大きなノーノーです。
public class MustAssert {
public static void main(String[] args) {
boolean exit = true;
assert (exit = false) == false;
if (exit) {
System.out.println("You forgot to turn assertions on with -ea.");
System.exit(0);
}
process(args);
}
public static void process(String[] args) {
// The rest of your program, whatever it may be, goes here.
for (String s : args) System.out.println(s);
}
}
ブールフラグは最初はtrueであり、ベイルアウトする必要があることを示しています。アサーションは、評価された場合、トートロジーです。変数はfalseに設定され、その部分式の値はfalseであり、これはfalseと比較false == false
され、trueと評価されるため、アサーションは渡され、noAssertionError
がスローされます。アサーションを評価する副作用として、フラグはfalseに設定されます。
アサーションがオフになっている場合、式は評価されず、フラグは初期値のtrueを保持します。次に、アサーションがオフになっているという警告とともにベイルアウトします。
AssertionErrorをスローしてキャッチするよりも、アサーションがオンになっているかどうかを検出しようとする場合、通常は眉をひそめますが、副作用のあるアサーションを使用する方が適切でクリーンだと思います。