Что такое ошибка 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()
очень похожи и служат той же концептуальной цели, но есть различия.
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
был инициализирован к тому времени, когда код пытается распечатать его.
assert len(tf.config.list_physical_devices('GPU')) > 0
это не будет работать, если вы используете коллаб
используйте ноутбук Jupyter для использования графического процессора физического устройства
AssertionError - это непроверенное исключение, которое явно вызывается программистом или разработчиком API, чтобы указать, что оператор assert не выполнен.
assert(x>10);
Выход:
AssertionError
Если x не больше 10, вы получите исключение во время выполнения, сообщающее AssertionError.