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