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

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

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 в моем собственном коде?

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

6 ответов

Решение

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

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

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

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

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

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

Примечание. Ошибка подтверждения относится к java.lang.Error And Errors, которые не предназначены для перехвата.

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

      assert len(tf.config.list_physical_devices('GPU')) > 0

это не будет работать, если вы используете коллаб

используйте ноутбук Jupyter для использования графического процессора физического устройства

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

assert(x>10);

Выход:

AssertionError

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

Другие вопросы по тегам