Вопрос

В чем разница между обработкой исключений Java и использованием assert условия?

Известно, что Assert бывает двух типов.Но когда мы должны использовать assert ключевое слово?

Это было полезно?

Решение

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

Не забывайте, что утверждения можно включать и выключать — если вас интересуют такие вещи, как проверка аргументов, это должно быть явно с использованием исключений.(Однако вы можете выполнить проверку аргументов на частный методы, использующие утверждения, на том основании, что нарушение в этот момент вызвано внутренней ошибкой, а не внешней ошибкой.)

В качестве альтернативы вполне разумно (IMO) использовать исключения для всего.Лично я вообще не использую утверждения, но в некоторой степени это вопрос личных предпочтений.(Конечно, могут быть объективные аргументы за и против утверждений, но они недостаточно ясны, чтобы полностью исключить предпочтения.)

Другие советы

Утверждения Java построены на основе исключений Java и обработки исключений.Действительно, когда утверждение Java терпит неудачу, результатом является исключение AssertionError, которое может быть перехвачено, как и любое другое исключение Java.Ключевые различия между исключениями и утверждениями:

  • Утверждения намеревался использоваться исключительно как средство обнаружения ошибок программирования, то есть ошибок.Напротив, исключение может указывать на другие виды ошибок или «исключительные» условия;напримернеправильный ввод пользователя, отсутствующие файлы, полная куча и т. д.
  • Язык Java обеспечивает синтаксическую поддержку утверждений в форме assert заявление.Сравните следующее:

    if (x != y) {
         throw new SomeException("x != y");
    }
    
    assert x != y;
    
  • Самое главное, Java позволяет вам включать или отключать проверку утверждений глобально или для отдельных классов при запуске JVM.

Примечание:некоторые люди говорят, что ты должен всегда запустить рабочий код с отключенной проверкой утверждений.Я склонен не согласиться с этим категоричным утверждением.Если известно, что ваш производственный код стабилен И вам нужно выжать из него последнюю часть производительности, то отключение утверждений — это хорошо.Но если (скажем) снижение производительности на 10% не является реальной проблемой, я бы предпочел, чтобы приложение умерло с ошибкой утверждения, если альтернативой является продолжение и повреждение моей базы данных.

@Mario Ortegón прокомментировал так:

«Отключение» связано с тем, что утверждения могут использоваться для проверки результата оптимизированного алгоритма путем сравнения его реализации с известным, но медленным алгоритмом.Итак, в разработке это нормально вызывать O(N^3) метод утверждать, что O(log N) алгоритм работает как задумано.Но это то, чего не нужно в производстве.

Независимо от того, думаете ли вы, что это так хорошая практика отключить утверждения в производстве, это определенно плохая практика для написания утверждений, которые при включении оказывают существенное влияние на производительность.Почему?Потому что это означает, что у вас больше нет возможности включать утверждения в производстве (для отслеживания проблемы) или в стресс-тестировании/тестировании мощности.На мой взгляд, если вам нужно сделать O(N^3) тестирование до/после выполнения условий, вы должны делать это в своих модульных тестах.

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

Утверждения никогда не должны быть частью реализации некоторых функций приложения.Их следует использовать только для проверки предположений – просто чтобы быть уверенными, что все, что мы предполагали при разработке решения, действительно справедливо и на практике.

ссылка: http://geekexplains.blogspot.com/2008/06/asserions-in-java-assertions-vs.html

Утверждения очень похожи на исключения: по сути, так же, как и исключения, они сигнализируют о проблеме, но в отличие от исключений — они не предлагают никакого альтернативного пути выполнения, а просто завершаются ошибкой.Зачем использовать утверждения, если вы можете сделать то же самое, плюс еще, с исключениями?

Используйте их, когда проблемы не должны быть устранены и вообще НИКОГДА НЕ ДОЛЖНЫ ПРОИЗОЙТИ.На первый взгляд это звучит странно:разве мы не хотим защитить наш код от ВСЕХ потенциальных проблем?Обычно да.Но есть случай, когда мы этого не делаем.Этот случай называется:«Проектирование по договору».

Допустим, вы пишете приложение для банка.Как разработчик, вы не можете поддерживать все возможные финансовые условия.Поэтому, прежде чем приступить к написанию кода, вы получаете от банка спецификацию, в которой указаны допустимые диапазоны, которые должно поддерживать это приложение.Итак, ваше приложение разработано по контракту (по спецификации банка).Этот контракт определит фундаментальные принципы, которые всегда должны соблюдаться, чтобы ваше приложение работало.Эти фундаментальные принципы называются «инвариантами» (потому что они не могут меняться).Проектирование по контракту упрощает вашу жизнь как разработчика — вы несете ответственность только за поддержку объема работ, определенного в контракте.
Важно проверять значения этих инвариантов в вашем коде, но не следует проверять их как исключения и пытаться обойти их.Если они неправы – вы должны потерпеть неудачу, потому что входные данные не выполнили свои договорные обязательства.

Самое интересное:если вы не поместите утверждение в критическое место и инварианты станут недействительными — ваш код все равно потерпит неудачу.Вы просто не будете знать, почему.Итак, подведем итог: утверждения используются для проверки инвариантов.Они идут рука об руку с принципом «проектирование по контракту».Используйте их для отладки проблемы, поэтому в рабочей среде они отключены.

Другой вариант использования:если вы полагаетесь на внешнюю библиотеку, которой не полностью доверяете, возможно, вы захотите использовать утверждения при ее вызове.

Некоторые также используют утверждения в качестве быстрой и грязной замены исключения (поскольку это так легко сделать), но концептуально это неправильно.

Пример хорошего использования Assert:

assert flibbles.count() < 1000000; // too many flibbles indicate something is awry
log.warning("flibble count reached " + flibbles.count()); // log in production as early warning

Я лично считаю, что Assert должен только использоваться, когда вы знаете, что что-то находится снаружи желательно ограничения, но вы можете быть уверены, что продолжать достаточно безопасно.Во всех других обстоятельствах (не стесняйтесь указывать на обстоятельства, о которых я не подумал) используйте исключения, чтобы быстро и сильно потерпеть неудачу.

Ключевой компромисс для меня заключается в том, хотите ли вы отключить работающую/производственную систему с помощью исключения, чтобы избежать повреждения и упростить устранение неполадок, или вы столкнулись с ситуацией, которой никогда нельзя позволять оставаться незамеченной в тестовых/отладочных версиях, но которая может будет разрешено продолжить производство (конечно, регистрация предупреждения).

ср. http://c2.com/cgi/wiki?FailFast см. также мою копию этого ответа на С#: Debug.Assert против.Конкретные выброшенные исключения

Assert предназначен только для целей отладки, и его условие триггера не должно возникать (нулевой указатель, когда его не должно быть и т. д.).

Исключением являются особые системные события, которые могут произойти всегда:FileNotFound, ConnectionToServerLost и т. д.

Как утверждение, так и обработка исключений могут гарантировать корректность программы и избежать логической ошибки,

но assertion может включать и отключать по желанию программиста,

в компиляторе, если вы используете "java -ea JavaFileName" или "java -enableasserations JavaFileName" вы можете скомпилировать с утверждением

если программистам это не нужно, "java -da JavaFileName " или "java -disableasserations JavaFileName " они могут отключить утверждение.

это средство не участвует в обработке исключений

Утверждение используется для отладки необходимых предположений, которые необходимо проверить во время выполнения, только путем включения функции утверждения, в то время как исключение предназначено для проверки конкретных условий, которые необходимо проверить во время выполнения программы, чтобы предотвратить завершение программы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top