有没有办法检查程序是否以-ea
启动,以便我可以退出/失败,如果不是?如果断言失败,我想知道它。因此,我认为没有这个就启动是一个严重的错误。
答案 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更好更清晰。