Какая польза от assert в java

Возможный дубликат:
Что делает assert?

assert проверяет предположение программиста во время разработки без написания обработчиков исключений для исключения. Это то, что я получил, когда искал assert.

Кроме того, люди также сказали, что это альтернатива обработке исключений. Утверждение станет очевидным, когда вы не захотите тратить время на написание кода обработки исключений. Но я не получил работы и не использовал. Кто-нибудь объяснит этот пример.

class AssertExample {

    public static void main(String[] args) {
        int x = 0;
        assert (x > 0) ? "assertion failed" : "assertion passed";
        System.out.println("finished");
    } }

person Ravi    schedule 04.11.2012    source источник
comment
я не знаю .. но я нашел это в гугле. вы можете проверить это здесь ... wiki.answers.com/Q/What_does_the_assert_keyword_do_in_Java   -  person Ravi    schedule 04.11.2012


Ответы (3)


assert - это не способ обработки исключений, это способ их обнаружения. (Таким образом, описания, которые вы находите, мне кажутся несколько неуместными.) Это, по сути, способ сказать:

Это должно быть правдой. Если это не так, вывести ошибку.

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

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

Глядя на вашу попытку использовать assert, похоже, вы близки. Это не совсем правильное использование:

assert (x > 0) ? "assertion failed" : "assertion passed";

Вы относитесь к assert как к логическому. А затем, используя оператор ? :, вы отключаете это логическое значение, чтобы ... ну ... на самом деле ничего не делать. Просто верните строку ("assertion failed" или "assertion passed") в строку кода, которая ничего не делает с этой строкой.

Близко, но не совсем.

Сам assert делает больше, чем просто проверяет условие. Он реагирует на условие, выдавая ошибку или позволяя продолжить выполнение кода. Он использует оператор :, но не как часть оператора ? :. Итак, я думаю, что вы пытаетесь сделать следующее:

assert (x > 0) : "assertion failed";

Это в основном говорит:

x всегда должен быть больше 0. Если это не так, что-то не так. Прекратите что-либо делать и вызовите ошибку.

Это вызовет AssertionError с сообщением "assertion failed" (которое, естественно, вы захотите заменить более значимым и полезным сообщением, включая любую полезную информацию времени выполнения об исследуемых значениях, чтобы помочь в отладке).

Затем в другом месте вы бы обработали это AssertionError и каким-то образом отреагировали на него.

Использование assert очень похоже на что-то вроде этого, только короче и немного выразительнее для его цели:

if (x <= 0) throw new CustomException("assertion failed");

Как видите, assert немного чище в том, что он:

  • Использует определенное ключевое слово, чтобы привлечь внимание к тому факту, что он проверяет условие с единственной целью проверки предположения. Это может быть if, или это может быть ответвление нового пути кода по любой другой причине.
  • Выдает конкретную ошибку, которую можно отфильтровать отдельно от других ошибок. Обратите внимание на то, что я использую CustomException, чтобы сделать то же самое, но AssertionError более известен / ожидаемо.
  • Использует меньше кода.
  • Демонстрирует истинное состояние, в отличие от обратного или ложного. В большинстве случаев истинное условие легче читать и более четко выражает намерения кода.
  • Следует условности и более идиоматичен.
  • Устанавливает код отдельно от остального кода как предназначенный для определенной цели, указывая другим разработчикам, что утверждение должно быть только утверждением. (Таким образом, другим разработчикам не следует изменять его как второй путь кода, возможно, добавляя побочные эффекты к утверждению.)
  • Может быть очень легко включен или выключен глобально для запущенного приложения. Java позволяет включать или отключать проверку утверждений в любом заданном контексте времени выполнения. Это очень удобно для глобального управления утверждениями как сквозной задачей.
person David    schedule 04.11.2012
comment
@BhavikAmbani: Простите? Не могли бы вы пояснить, что имеете в виду? - person David; 04.11.2012

Википедия:

В компьютерном программировании утверждение - это предикат (утверждение "истина-ложь"), помещенный в программу, чтобы указать, что разработчик считает, что предикат всегда истинен в этом месте. Использование утверждений помогает программисту проектировать, разрабатывать и рассуждать о программе.

Вы можете включить утверждения во время выполнения, используя переключатель -ea. Утверждение также можно включить выборочно

java -ea:pl.maciejziarko.service.UserService

Некоторые правила относительно утверждений (из руководства SCJP Sun Certified Programmer for Java 6 Study Guide):

  • Не используйте утверждения для проверки аргументов общедоступного метода
  • Используйте утверждения для проверки аргументов частного метода
  • Не используйте утверждения для проверки аргументов командной строки
  • Используйте утверждения для проверки случаев, которые, как вы знаете, никогда не должны были произойти
  • Не используйте выражения утверждения, которые могут вызвать побочные эффекты
person Maciej Ziarko    schedule 04.11.2012
comment
Буду признателен, если вы также объясните на моем примере. :-) - person Ravi; 04.11.2012

Assert предназначен для проверки предположений о вашем коде во время разработки.

Они, как правило, используются по контракту как своего рода дизайн для бедняков.

Например, я использую их для проверки предварительных / пост-условий и инвариантов кода.

person Paulo Pinto    schedule 04.11.2012