4

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

4

3 回答 3

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

于 2013-01-21T18:57:00.400 回答
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);
    }
}
于 2013-01-21T18:58:24.557 回答
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抛出 no。该标志设置为 false 作为评估断言的副作用。

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

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

于 2013-01-21T19:52:58.917 回答