在阅读Joshua Bloch的《Effective Java - 第二版》时,我在第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);
}
现在让我困惑的是,为什么会主动抛出
AssertionError
?这被认为是好习惯吗?根据我的理解,断言是用来不干扰代码的,这样当启动 Java 编程时没有启用断言且因此未执行 assert 语句时,行为不会改变。
如果我在运行程序时甚至还没有启用断言,却收到
AssertionException
,那我就很困惑了。尽管我明白这种示例情况可能经常发生,即分析几个不同的选项,如果都不是,则应抛出异常。
所以,在这里抛出
AssertionException
是好习惯吗?还是更好地抛出其他异常?如果是,哪个最适合呢?也许是IllegalArgumentException
?编辑以澄清问题:我的问题不在于我们是否应该在这里抛出
Error
,而是如果我们想要抛出 Exception
或 Error
,应该选择哪个?在活跃地抛出 AssertionError
是否是好习惯?文档中说“抛出以指示断言失败”,所以我觉得我们不应该主动抛出它。这正确吗?第二次编辑:清晰明确的问题:活跃地抛出
AssertionError
是好习惯吗,还是应该避免,即使可能性存在?(通过阅读文档,我猜测是后者)
AssertionError
。我认为在生产环境中不检查断言的主要原因是检查断言的成本,在问题的示例中我认为不存在这样的成本。我站在Bloch的立场上。 - Ole V.V.AssertionError
是可以的。如果这样做,断言无需打开。 - Mathias Bader