1. ホーム
  2. java

[解決済み】 AssertionErrorとは何ですか?どのような場合に自分のコードからそれを投げるべきですか?

2022-02-08 07:50:37

質問

Effective Java, 2nd edition"のアイテム2に、著者がオブジェクトの空の初期化を禁止したいコードのスニペットがあります。

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

投げられた例外の種類が、ここで私を混乱させるものです。

というのがよくわからない。 AssertionError が投げられるのは、もっと適したエラーがないからなのか、それともこうでなければならないからなのか。

私の理解では、このエラーは、フレームワークによって assert ステートメントが失敗します。また、javadocには、次のように書かれているだけです。

[AssertionError is] アサーションが失敗したことを示すために投げられます。

しかし、ここではアサーション(真偽判定文)に違反しているとは思えません。 もちろん、「このクラスのアイテムをインスタンス化してはならない」というステートメントには違反していますが、もしこれがそのロジックであるならば、私たちは皆、次のように投げるべきでしょう。 AssertionError が至る所にありますが、明らかにそうなっていません。

FWIW、私だったら、ただ単に

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

何か問題があるのでしょうか?どのような場合、私は AssertionError を、私自身のコードで使用することはできますか?

微妙な疑問で申し訳ないのですが、私はこのパターンを自分のコードでよく使うので、正しいことをやっているかどうか確認したいのです。

どのように解決するのですか?

<ブロッククオート

もちろん、「このクラスのアイテムをインスタンス化してはならない」という声明に違反しているのですが、もしこれがそのロジックであるならば、みんなで AssertionErrors というのは、明らかにおかしい。

このコードでは、ユーザーが はいけません。 はゼロ引数コンストラクタを呼び出します。このアサーションは、プログラマが認識している限りにおいて、彼/彼女はそれを 不可能 ゼロ引数コンストラクタを呼び出すこと(この場合、ゼロ引数コンストラクタを呼び出すために private の中から呼び出さないことです。 Example のコード)。それで、呼び出しが発生すると、そのアサーションに違反したことになり、それで AssertionError が適切です。