80

在《Effective Java, 2nd edition》一书的Item 2中,有一段代码,作者想在其中禁止一个对象的空初始化。

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

抛出的异常类型在这里让我感到困惑。

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

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

[An AssertionError is] 抛出以指示断言失败。

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

FWIW,我刚刚扔了一个

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

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

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

4

5 回答 5

59

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

代码并不是说用户不应该调用零参数构造函数。断言是说,就程序员所知,他/她已经无法调用零参数构造函数(在这种情况下,通过创建它private而不是从Example's 的代码中调用它)。因此,如果发生调用,则该断言已被违反,因此AssertionError是适当的。

于 2014-07-21T10:46:58.733 回答
42

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

因此,如果AssertionError曾经抛出 an ,则这是编程错误的明显迹象。

于 2014-07-21T10:47:06.410 回答
21

当说“您编写了一个不应该不惜一切代价执行的代码,因为根据您的逻辑它不应该发生。但是如果它发生然后抛出 AssertionError。你没有抓住它。”时抛出一个断言错误。在这种情况下,您会抛出一个断言错误。

new IllegalStateException("Must not instantiate an element of this class")' // Is an Exception not error.

注意:断言错误属于 java.lang.Error 和错误并不意味着被捕获。

于 2014-07-21T10:54:21.677 回答
10

我在这里聚会真的很晚了,但大多数答案似乎都是关于使用断言的原因和时间,而不是AssertionError特别使用。

assert并且throw new AssertionError()非常相似并且服务于相同的概念目的,但存在差异。

  1. throw new AssertionError()无论是否为 jvm 启用了断言(即,通过-ea开关),都会抛出异常。
  2. 编译器知道这throw new AssertionError()将退出该块,因此使用它可以让您避免某些assert不会出现的编译器错误。

例如:

    {
        boolean b = true;
        final int n;
        if ( b ) {
            n = 5;
        } else {
            throw new AssertionError();
        }
        System.out.println("n = " + n);
    }

    {
        boolean b = true;
        final int n;
        if ( b ) {
            n = 5;
        } else {
            assert false;
        }
        System.out.println("n = " + n);
    }

上面的第一个块编译得很好。第二个块没有编译,因为编译器不能保证n在代码尝试打印它时已经初始化。

于 2019-05-22T18:14:53.100 回答
-3

AssertionError是一个未经检查的异常,它由程序员或 API 开发人员显式上升以指示断言语句失败。

assert(x>10);

输出:

AssertionError

如果 x 不大于 10,那么您将收到运行时异常 AssertionError。

于 2017-10-02T10:12:03.427 回答