Подтвердить что ты не робот

Что такое AssertionError? В каком случае я должен выбросить его из своего собственного кода?

В пункте 2 книги "Эффективное Java, 2-е издание" есть этот фрагмент кода, в котором автор хочет запретить пустую инициализацию объекта.

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

Тип брошенного исключения, вот что меня смущает.

Я не понимаю, выбрано ли AssertionError только из-за отсутствия более подходящих ошибок или потому, что это должно быть так.

Как я понимаю, эта ошибка генерируется каркасом, когда оператор assert терпит неудачу. Кроме того, в javadoc он просто написал

[AssertionError] Брошено, чтобы указать, что утверждение не сработало.

Но я не вижу никакого утверждения (true-false statement), которое нарушается здесь. Конечно, "Вы не должны создавать экземпляр этого класса" было нарушено, но если это логика этого, тогда мы все должны бросать AssertionError всюду, и это, очевидно, не так.

FWIW, я бы просто бросил

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

С этим что-то не так? В каком случае я должен бросать AssertionError в свой собственный код?

Извините, если это просто тонкое сомнение, но я часто использую этот шаблон в своем коде, и я хочу убедиться, что я поступаю правильно.

4b9b3361

Ответ 1

Конечно, утверждение "Вы не должны создавать экземпляр этого класса" было нарушено, но если это логика этого, тогда мы все должны бросать AssertionErrors всюду, и это, очевидно, не так. /p >

В коде не говорится, что пользователь не должен вызывать конструктор zero-args. Утверждение состоит в том, чтобы сказать, что, насколько известно программисту, он/она сделал невозможным вызов конструктора zero-args (в этом случае, сделав его private и не называя его из кода Example). Итак, если вызов происходит, это утверждение было нарушено, поэтому AssertionError подходит.

Ответ 2

Значение AssertionError заключается в том, что что-то случилось, что разработчик считал невозможным.

Итак, если a AssertionError когда-либо бросается, это явный признак ошибки программирования.

Ответ 3

Ошибка утверждения вызывается, когда говорят: "Вы написали код, который не должен выполняться любой ценой, потому что, согласно логике, это не должно произойти. НО, если это произойдет, то бросьте AssertionError, и вы не поймаете его". В этом случае вы вызываете ошибку утверждения.

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

Примечание. Ошибка утверждения появляется под java.lang.Error И ошибки, которые не должны быть пойманы.

Ответ 4

Я действительно опаздываю на вечеринку здесь, но большинство ответов, похоже, касаются причин и случаев использования утверждений в целом, а не использования 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 было инициализировано к тому времени, когда код пытается его распечатать.

Ответ 5

AssertionError - это Unchecked Exception, которое явно выражается программистом или разработчиком API, чтобы указать, что утверждение assert не работает.

assert(x>10);

Вывод:

AssertionError

Если x не больше 10, вы получите исключение во время выполнения, ссылающееся на AssertionError.

Ответ 6

Мы предполагаем, что, как только пользователь узнает мнение, он/она не будет вызывать конструктор с нулевыми аргументами, логику, которую мы пытаемся утвердить, и поэтому выдается ошибка AssertionError.