什么是断言错误?在哪种情况下,我应该从自己的代码中丢弃它?

2022-08-31 12:16:12

在“Effective Java,第2版”一书的第2项中,有这样一段代码,其中作者希望禁止对对象进行空初始化。

class Example {
    private Example() {
        throw new AssertionError();
    }
}

抛出的异常类型,是我在这里感到困惑的地方。

我不明白是否只是因为没有更合适的错误而抛出,或者因为它应该是这样。AssertionError

据我所知,当语句失败时,框架会引发此错误。另外,在javadoc中,它只是写的assert

[断言错误是]抛出以指示断言已失败。

但我没有看到任何断言(真假陈述)在这里被违反。当然,“你不能实例化这个类的一个项目”的说法已经被违反了,但如果这是这背后的逻辑,那么我们都应该到处扔s,这显然不是发生的事情。AssertionError

FWIW,我会抛出一个

new IllegalStateException("Must not instantiate an element of this class")

这有什么问题吗?在哪种情况下,我应该在自己的代码中抛出一个?AssertionError

抱歉,如果这只是一个微妙的疑问,但我在我的代码中经常使用这种模式,我想确保我正在做正确的事情。


答案 1

当然,“你不应该实例化这个类的一个项目”的说法已经被违反了,但如果这是这背后的逻辑,那么我们都应该到处扔,这显然不是发生的事情。AssertionErrors

代码并不是说用户不应该调用零参数构造函数。断言是说,就程序员所知,他/她已经使调用零参数构造函数变得不可能(在这种情况下,通过制作它而不是从 的代码中调用它)。因此,如果发生调用,则该断言已被违反,因此是合适的。privateExampleAssertionError


答案 2

的含义是发生了开发人员认为不可能发生的事情。AssertionError

因此,如果抛出 an,则明显表示存在编程错误。AssertionError