当前位置: 首页 > 面试题库 >

什么是AssertionError?在哪种情况下,我应该从自己的代码中抛出它?

姜煌
2023-03-14
问题内容

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

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

引发异常的类型使我感到困惑。

我不知道AssertionError是因为缺少更合适的错误还是因为这样而抛出了。

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

抛出[AssertionError],表明断言失败。

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

FWIW,我刚扔了一个

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

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

抱歉,这只是一个微妙的疑问,但是我在代码中经常使用此模式,所以我想确保自己做的正确。


问题答案:

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

该代码不是说用户 不应 调用零参数构造函数。断言是说,据程序员所知,他/她使得 不可能 调用zero-
args构造函数(在这种情况下,是使它成为零,private而不是从内部Example代码中调用它)。因此,如果发生呼叫,则该声明已被违反,因此AssertionError是适当的。



 类似资料:
  • 在《Effective Java,N2 Edition》一书的第2项中,有一段代码,作者希望禁止对象的空初始化。 我不明白抛出是因为没有更合适的错误,还是因为应该这样。 据我所知,当语句失败时,框架会抛出此错误。另外,在javadoc中,它只是编写了 [AssertionError]引发以指示断言失败。

  • 问题内容: 我偶然发现该语句(从一些更复杂的代码中摘录)进行编译: 在短暂但快乐的时刻,我认为受检查的异常最终决定已经死亡,但是对此仍然感到遗憾: 该块不必为空;似乎可以有代码,只要该代码不引发检查异常即可。这似乎是合理的,但是我的问题是,语言规范中的哪个规则描述了此行为?据我所知,§14.18throw语句明确禁止使用它,因为表达式的类型是已检查的异常,并且不会被捕获或声明为被抛出。(?) 问题

  • 你好,我正在学习OOP,通过编写一个虚拟的库管理项目在Java。 在serachBook()中,如果在ArrayList中找到book,则返回book对象,如果未找到,则抛出自定义异常BookNotFound。 问题1:它应该只返回null并在调用代码时检查返回值是否为null,还是抛出自定义异常BookNotFound。 目前我认为BookNotFinder是合适的,并且目前正在这样做。然而,我

  • 在包的javaodoc中,在一节的末尾,我读到: 大多数流操作接受描述用户指定行为的参数,这些参数通常是lambda表达式。为了保持正确的行为,这些行为参数必须是无干扰的,并且在大多数情况下必须是无状态的。 我很难理解这个“在大多数情况下”。在哪些情况下,有状态流操作是可以接受/希望的? 还请注意,试图从行为参数访问可变状态会给您带来一个关于安全性和性能的糟糕选择;[...]最好的方法是完全避免有

  • 我将guava jar文件添加到类路径中,但我的IDE(eclipse)说: Nullable无法解析为类型 但如果我ctrl+单击Nullable,我会看到蓝色下划线,然后看到下划线: