В Объекте 2 из "Эффективного Java, 2-й выпуск" книга, существуют этот отрывок кода, в котором автор хочет запретить пустую инициализацию объекта.
class Example {
private Example() {
throw new AssertionError();
}
}
Тип выданного исключения, то, что смущает меня здесь.
Я не понимаю если AssertionError
брошен только из-за отсутствия более подходящих ошибок или потому что это должен быть этот путь.
Как я понимаю, эта ошибка брошена платформой когда assert
сбои оператора. Кроме того, в javadoc это просто записано
[AssertionError] Брошен, чтобы указать, что утверждение перестало работать.
Но я не вижу утверждения (истинно-ложный оператор) нарушаемый здесь. Конечно, оператор "You shall not instantiate an item of this class" был нарушен, но если это - логика позади этого, то мы должны все бросить AssertionError
s везде, и это, очевидно, не, что происходит.
FWIW, я просто бросил бы a
new IllegalStateException("Must not instantiate an element of this class")
Есть ли что-то не так с этим? В этом случае должен я бросать AssertionError
в моем собственном коде?
Извините, если это - просто тонкое сомнение, но я использую этот шаблон много в моем коде, и я хочу удостовериться, что я делаю правильную вещь.
Я действительно опаздываю для посещения вечеринок здесь, но большинство ответов, кажется, о whys и whens использования утверждений в целом, вместо того, чтобы использует AssertionError
в частности.
assert
и throw new AssertionError()
очень похожи и служат той же концептуальной цели, но существуют различия.
throw new AssertionError()
выдаст исключение независимо от того, включены ли утверждения для jvm (т.е. через эти -ea
переключатель). 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
был инициализирован к тому времени, когда код пытается распечатать его.