繁体   English   中英

在Java中,如果我的程序没有-ea运行怎么办?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM