Спецификация Java 11: 11.2. Проверка исключений во время компиляции

Язык программирования Java требует, чтобы программа содержала обработчики проверенных исключений, которые могут возникнуть в результате выполнения метода или конструктора. Эта проверка во время компиляции на наличие обработчиков исключений предназначена для уменьшения количества исключений, которые не обрабатываются должным образом. Для каждого проверенного исключения, которое является возможным результатом, предложение throws для метода или конструктора должно упоминать класс этого исключения или один из суперклассов класса этого исключения.

Проверенные классы исключений, указанные в предложении throws, являются частью контракта между разработчиком и пользователем метода или конструктора. Предложение throws переопределяющего метода может не указывать, что этот метод приведет к сбору любого проверенного исключения, которое переопределенному методу не разрешено с помощью его предложения throws. Когда задействованы интерфейсы, более одного объявления метода может быть переопределено одним замещающим объявлением. В этом случае переопределяющее объявление должно иметь предложение throws, совместимое со всеми переопределенными объявлениями.

Непроверенные классы исключений освобождены от проверки во время компиляции.

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

Классы исключений во время выполнения исключаются, потому что, по мнению разработчиков языка программирования Java, необходимость объявления таких исключений не может существенно помочь в установлении правильности программ. Многие операции и конструкции языка программирования Java могут вызывать исключения во время выполнения. Информация, доступная компилятору Java, и уровень анализа, выполняемого компилятором, обычно недостаточны, чтобы установить, что такие исключения времени выполнения не могут произойти, даже если это может быть очевидно для программиста. Требование объявления таких классов исключений было бы просто раздражением для программистов.

Например, определенный код может реализовать круговую структуру данных, которая по своей конструкции никогда не может включать пустые ссылки; тогда программист может быть уверен, что исключение NullPointerException не может возникнуть, но компилятору Java будет сложно это доказать. Технология доказательства теорем, необходимая для установления таких глобальных свойств структур данных, выходит за рамки данной спецификации.

Мы говорим, что оператор или выражение может вызвать исключение класса E, если, согласно правилам, выполнение оператора или выражения может привести к выбросу исключения класса E.

Мы говорим, что предложение catch может перехватывать свои перехватываемые классы исключений:

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

Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки