1. Обзор
В языках C и C++ есть ключ Assert, который означает утверждение.
В Java также есть ключевое слово Assert, которое означает утверждение. Его использование и значение аналогичны.
2. Грамматика
В Java ключевое слово Assert было введено в JAVA SE 1.4. Чтобы избежать ошибок, вызванных использованием ключевого слова Assertion в старых версиях кода Java, Java не включает проверку утверждений по умолчанию при выполнении (в настоящее время все операторы Assertion будут выполняться). игнорироваться!), если вы хотите включить проверку утверждений, вам нужно включить ее с помощью переключателя -enableassertions или -ea.
Синтаксис ключевого слова Assert очень прост и имеет два применения:
1. утвердить <логическое выражение>
Если <логическое выражение> истинно, выполнение программы продолжается.
Если значение false, программа выдает AssertionError и прекращает выполнение.
2. Assert <логическое выражение>: <выражение сообщения об ошибке>
Если <логическое выражение> истинно, выполнение программы продолжается.
Если оно ложно, программа выдает java.lang.AssertionError и вводит <выражение сообщения об ошибке>.
3. Примеры применения
Ниже приведен пример, иллюстрирующий его использование:
Скопируйте код кода следующим образом:
общественный класс AssertFoo {
public static void main(String args[]) {
//Результат утверждения 1 верен, затем продолжаем выполнение.
утверждать правду;
System.out.println("С утверждением 1 проблем нет, вперед!");
System.out.println("/n-----------------/n");
//Результат утверждения 2 ложный и программа завершается
Assert false : «Утверждение не выполнено, информация этого выражения будет выведена при возникновении исключения!»;
System.out.println("С утверждением 2 проблем нет, вперед!");
}
}
Сохраните код в C:/AssertFoo.java, затем выполните его следующим образом и просмотрите вывод консоли:
1. Скомпилируйте программу:
C:/>javac AssertFoo.java
2. Программа по умолчанию выполняется без включения ключа -ea:
C:/>Java AssertFoo
Утверждение 1 подходит, Go!
------------------
Утверждение 2 не проблема, вперед!
3. Включите ключ -ea и выполните программу:
C:/>java -ea AssertFoo
Утверждение 1 подходит, Go!
------------------
Исключение в потоке «main» java.lang.AssertionError: утверждение не выполнено, информация этого выражения будет
Будет выводиться при возникновении исключения!
в AssertFoo.main(AssertFoo.java:10)
4. Ловушка
Ключевое слово Assert использовать просто, но его использование часто приводит к тому, что вы попадаете во все более и более глубокую ловушку. Следует избегать. После исследования автор суммировал следующие причины:
1. Ключевое слово Assert должно быть явно включено во время выполнения, чтобы оно вступило в силу, иначе ваше утверждение будет бессмысленным. В настоящее время основные инструменты Java IDE по умолчанию не включают функцию проверки утверждений -ea. Это означает, что если вы используете инструменты IDE для написания кода, у вас возникнут некоторые проблемы при отладке и запуске. Более того, для веб-приложений Java программный код развертывается в контейнере, и вы не можете напрямую контролировать запуск программы. Если вам необходимо включить ключ -ea, вам необходимо изменить параметры текущей конфигурации веб-контейнера. Это приносит большие неудобства при трансплантации и развертывании программ.
2. Использование Assert вместо if — вторая ловушка. Оценка утверждения аналогична решению оператора if, но функции этих двух существенно различны: ключевое слово Assert предназначено для использования при тестировании и отладке программы, но если вы случайно используете утверждение для управления бизнес-процессом программы, оно не будет использоваться во время тестирования и отладки. Удаление ключевого слова Assert после завершения означает изменение обычной логики программы.
3. Если утверждение утверждения не выполнено, программа завершится. Это никогда не будет допущено в производственной среде. Потенциальные ошибки в программе обычно устраняются путем обработки исключений. Но использование утверждений очень опасно. В случае сбоя система зависнет.
5. Мысли об утверждении
Поскольку Assert предназначен для отладки тестовых программ, а не для использования в формальных производственных средах, вам следует подумать о том, чтобы лучше протестировать JUint, чтобы заменить его функцию. JUint предоставляет еще больше ключевых функций, чем Assert. Конечно, отладку и тестирование можно проводить через отладку IDE. С этой точки зрения будущее Assert мрачно.
Поэтому вам следует избегать использования ключевого слова Assert в Java, если только однажды Java не будет поддерживать ключ -ea по умолчанию, тогда вы сможете рассмотреть его. Сравните, сколько пользы и сколько неприятностей может принести вам утверждение. Это принцип, по которому мы можем решить, использовать ли его.
=============================================== ==========
комментарий:
С другой стороны, в некоторых компонентах с открытым исходным кодом, таких как валидатор и junit, процесс оценки, похоже, использует стиль утверждений. Весьма вероятно, что используется большое количество утверждений, но автор не может быть уверен в этом, прежде чем взглянуть на них. исходный код.
Если это простой тест на этапе разработки, то junit — удобный и мощный инструмент. Нет причин не использовать его при написании собственных утверждений.
=============================================== ==========
комментарий:
Во-первых, его можно использовать в коде модульного теста. Junit очень навязчив. Если большой объем кода во всем проекте использует Junit, его будет сложно удалить или выбрать другой фреймворк. Если имеется много кодов модульных тестов и вы хотите повторно использовать эти примеры модульных тестов, вам следует выбрать Assert вместо Junit, чтобы облегчить использование других платформ модульного тестирования, таких как TestNG. По этой же причине Junit вообще не должен появляться в формальном функциональном коде, и следует использовать Assert.
Assert в основном подходит для базовых классов, классов инфраструктуры, классов интерфейса, классов основного кода и классов инструментов. Другими словами, его необходимо использовать, когда вызывающим объектом вашего кода является бизнес-код, написанный другим программистом или другой подсистемой. Например, если вы создадите алгоритм быстрой сортировки
Скопируйте код кода следующим образом:
общедоступный статический список <int> QuickSort (список List <int>) {
список утверждений!= ноль;
//Подать заявку на временное пространство
//Начало сортировки
for(int я: список){
//
}
}
В этом случае, если корректность входящих параметров не будет проверена, будет выдана необъяснимая ошибка нулевого указателя. Вызывающие программы могут не знать деталей вашего кода, а отладка ошибки нулевого указателя глубоко в системе — пустая трата времени. Вы должны прямо и четко сообщить вызывающему абоненту, что существует проблема с переданными параметрами. В противном случае он заподозрит, что в вашем коде есть ОШИБКА. Использование утверждения может помешать двум программистам обвинять друг друга в проблемах с написанным ими кодом.
Assert применяется к ошибкам, о которых вы точно знаете, что это за ошибка, и вы и вызывающий объект договорились, что вызывающий объект должен устранить или проверить наличие ошибок. Вы сообщаете об этом вызывающему абоненту с помощью утверждения. Утверждение не применяется к ошибкам, вызванным внешними системами, например ошибкам во входных данных пользователя или ошибкам формата во внешнем файле. Эти ошибки вызваны не вашим вызывающим абонентом, а пользователем и даже не являются исключениями, поскольку ошибки ввода и ошибки формата файла являются общими, и эти ошибки должны проверяться бизнес-кодом.
Assert больше подходит для часто вызываемых базовых классов, кода платформы, классов инструментов, основного кода и кода интерфейса. Вот почему он удаляется во время выполнения. Тестовый код должен включать параметр -ea на этапе тестирования, чтобы облегчить тщательное тестирование основного кода глубоко в системе.
Причина, по которой Java использует утверждение реже, заключается в том, что Java имеет очень полную объектно-ориентированную систему и принудительное преобразование типов происходит реже, поэтому нет необходимости часто проверять, правильный ли тип указателя и является ли указатель пустым, как C. В то же время Java редко управляет памятью или буферами напрямую, поэтому нет необходимости часто проверять, пуст ли входящий буфер или не пересек границу.
Но правильное использование утверждения может помочь повысить корректность кода платформы и сократить время отладки пользователями кода платформы.
=============================================== =============
комментарий:
Цель утверждения — позволить программистам легко обнаруживать свои собственные логические ошибки, не влияя при этом на эффективность программы. Ошибки, обнаруженные утверждением, вообще не должны возникать и не могут быть заменены исключениями. Исключения допускаются системой или представляют собой «ошибки», которые не контролируются системой. Они не являются логическими проблемами программиста.
Assert следует включать во время разработки и отключать после выпуска.