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

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

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

Тип выданного исключения, то, что смущает меня здесь.

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

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

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

Но я не вижу утверждения (истинно-ложный оператор) нарушаемый здесь. Конечно, оператор "You shall not instantiate an item of this class" был нарушен, но если это - логика позади этого, то мы должны все бросить AssertionErrors везде, и это, очевидно, не, что происходит.

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

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

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

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

61
задан 21 July 2014 в 15:03

1 ответ

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

2
ответ дан 31 October 2019 в 16:11

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

Похожие вопросы: