通过Joshua Bloch的"Effective Java - Second Edition",我偶然发现了第152页的以下代码:
double apply(double x, double y) {
switch(this) {
case PLUS: return x + y;
case MINUS: return x - y;
case TIMES: return x * y;
case DIVIDE: return x / y;
}
throw new AssertionError("Unknown op: " + this);
}
Run Code Online (Sandbox Code Playgroud)
现在令我困惑的是,AssertionError积极抛出.这被认为是好习惯吗?根据我的理解,断言用于不干扰代码,以便在没有启用断言的情况下启动java编程并且因此不执行断言语句时,行为不会改变.如果我AssertionException在没有启用断言的情况下运行程序时,我会感到很困惑.
即使我理解示例情况可能经常发生,你分析了几个不同的选项,如果它们都不是,你应该抛出异常.
那么抛出AssertionException这里是一种好习惯,还是抛弃另一种更好?如果是这样,哪一个最适合?也许IllegalArgumentException?
编辑澄清:我的问题不是关于我们是否应该抛出一个Error,但是如果我们想要抛出一个Exception或一个Error,它应该是什么?积极投掷AssertionErrors 是好的做法吗?文档说Thrown表示断言失败了,所以我觉得我们不应该主动抛出它.那是对的吗?
第二次编辑:明确的问题:AssertionError即使有可能,积极投掷或应该避免这种做法是否良好?(我猜读文档是后者)
我以标准的方式在Java中使用断言,在我的IDE中打开它们.所以他们不是生产发布的一部分.最近我一直在看代码示例,throw new AssertionError()我开始考虑AssertionError应该使用的情况而不是断言.
我的猜测主要区别在于断言的可选性,因此它们不会降低生产性能,因此它们可以在代码中经常出现,但修复用户报告的难以再现的错误则更难.
因为AssertionError,恰恰相反.
我还发现AssertionError在执行不应该得到的代码中更实用,而不是使用assert false //We should not be here.特别是如果需要返回值.例如:
int getFoo(AnEnum a){
if (a == AnEnum.ONE)
return bar();
else if (a == AnEnum.TWO)
return SOME_VALUE;
//else
assert false; //throw new AssertionError();
return -1; //not necessary when usin AssertionError
}
Run Code Online (Sandbox Code Playgroud)
AssertionError- 应该提供还是仅仅是Error(和断言类型)的事实足以或多或少地确定在发现错误的情况下将提供堆栈跟踪?