在Java中,如果我的程序在没有-ea的情况下运行,我怎么会失败?

时间:2013-01-21 18:55:29

标签: java assertions

有没有办法检查程序是否以-ea启动,以便我可以退出/失败,如果不是?如果断言失败,我想知道它。因此,我认为没有这个就启动是一个严重的错误。

3 个答案:

答案 0 :(得分:6)

断言保证失败。

如果该断言后的代码运行,则断言未启用。

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断言更多的是用于开发而不是正常的错误检查/处理。

答案 1 :(得分:4)

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);
    }
}

答案 2 :(得分: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);
    }
}

布尔标志最初为真,表示我们应该纾困。断言,如果被评估,是一个重言式。该变量设置为false,该子表达式的值为false,然后将其与false进行比较,并且由于false == false的计算结果为true,因此断言通过并且不会抛出AssertionError。该标志设置为false,作为评估断言的副作用。

如果关闭断言,则永远不会计算表达式,并且该标志保留其初始值true。然后,我们发出警告,断言断言已被关闭。

我认为使用带有副作用的断言虽然通常不赞成,但在尝试检测断言是否打开时比抛出和捕获AssertionError更好更清晰。