[英]In Java, how can I fail if my program is run without -ea?
有没有一种方法可以检查程序是否以-ea
启动,如果不是,则可以退出/失败? 如果断言失败,我想被告知。 因此,我认为在没有这种情况下启动是一个严重的错误。
保证断言失败。
如果该断言之后的代码运行,则不会启用断言。
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,因此断言通过且不会引发AssertionError
。 将该标志设置为false作为评估断言的副作用。
如果断言关闭,则永远不会对表达式求值,并且标志保留其初始值true。 然后,我们会发出警告,指出断言已被关闭。
我认为使用带有副作用的断言,尽管通常会被人们皱眉,但是在尝试检测断言是否已打开时比抛出并捕获AssertionError更好,更清洁。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.