Что такое 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
в свой собственный код?
Извините, если это просто тонкое сомнение, но я часто использую этот шаблон в своем коде, и я хочу убедиться, что я поступаю правильно.
Ответы
Ответ 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()
очень похожи и служат той же концептуальной цели, но есть различия.
-
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
было инициализировано к тому времени, когда код пытается его распечатать.
Ответ 5
AssertionError - это Unchecked Exception, которое явно выражается программистом или разработчиком API, чтобы указать, что утверждение assert не работает.
assert(x>10);
Вывод:
AssertionError
Если x не больше 10, вы получите исключение во время выполнения, ссылающееся на AssertionError.
Ответ 6
Мы предполагаем, что, как только пользователь узнает мнение, он/она не будет вызывать конструктор с нулевыми аргументами, логику, которую мы пытаемся утвердить, и поэтому выдается ошибка AssertionError.