
- •Программирование на Java Тема 4.1 Обработка исключительных ситуаций
- •Исключительные ситуации
- •Исключительные ситуации
- •Исключительные ситуации
- •Классы исключений
- •Классы исключений
- •Классы исключений
- •Классы исключений
- •Описание исключительной ситуации
- •Описание исключительной ситуации
- •Множественный блок catch{}
- •Множественный блок catch{}
- •Вложенные блоки try
- •Вложенные блоки try
- •Вложенные блоки try
- •Вложенные блоки try
- •Генерирование исключений
- •Генерирование исключений
- •Генерирование исключений
- •Выбрасывание исключений методами
- •Выбрасывание исключений методами
- •Выбрасывание исключений методами
- •Контролируемые и неконтролируемые исключения
- •Контролируемые и неконтролируемые исключения
- •Контролируемые и неконтролируемые исключения
- •Создание собственных исключений
- •Создание собственных исключений
- •Создание собственных исключений
- •Создание собственных исключений
- •Создание собственных исключений

Выбрасывание исключений методами
• Пример 7. Метод выбрасывает исключение
21

Выбрасывание исключений методами
Ранее отмечалось, что если метод выбрасывает или может выбросить исключение, которое в методе не обрабатывается, этот факт нужно отразить при описании метода. В сигнатуре метода после ключевого слова throws перечисляются классы исключений, которые может выбрасывать метод. Причина такой предупредительности состоит в том, что внешним методам нужно сообщить, к каким неприятностям следует быть готовым при вызове данного метода. Ранее мы не использовали ключевое слово throws, хотя некоторые методы и выбрасывали исключения. Дело в том, что перечисляются далеко не все выбрасываемые методом исключения. В частности, не нужно явно указывать исключения класса Error, а также класса RuntimeException и его подклассов. Рассматривавшиеся ранее исключения как раз относились к подклассам RuntimeException.
Общий синтаксис описания метода, выбрасывающего исключения представлен на слайде.
Пример описания метода, выбрасывающего необрабатываемое исключение, приведен на слайде.
Программа достаточно простая и ее особенность лишь в том, что при описании метода throwOne() явно указано, что метод может выбрасывать исключение класса IllegalAccessException (ошибка доступа). Методом throwOne() выводится на экран сообщение об ошибке, затем выбрасывается исключение командой: throw new IllegalAccessException("Большая ошибка!").
В данном случае исключение — это анонимный объект класса IllegalAccessException, для создания которого использовался конструктор с текстовым аргументом. В методе это исключение не отслеживается и не обрабатывается, о чем и свидетельствует наличие в сигнатуре метода ключевого слова throws и названия класса исключения IllegalAccessException. Отметим, что если бы это исключение в методе обрабатывалось, необходимости указывать в сигнатуре метода ключевое слово throws (и класса исключения) не было бы.
В главном методе программы вызывается метод throwOne(), выбрасываемое методом исключение отслеживается и обрабатывается. Объект (анонимный) выброшенного методом исключения передается в блок catch.
22

Контролируемые и неконтролируемые исключения
Таблица1. Контролируемые исключения в Java :
23

Контролируемые и неконтролируемые исключения
Таблица2. Неконтролируемые исключения в Java :
24

Контролируемые и неконтролируемые исключения
Встроенные исключения в Java делятся на контролируемые и неконтролируемые. Фактически, перечислять выбрасываемые методом исключения в сигнатуре метода нужно только в том случае, если они неконтролируемые. В табл.1 приведены некоторые контролируемые исключения в Java.
Еще раз отметим, что даже если метод не обрабатывает и выбрасывает контролируемое исключение, отражать этот факт в сигнатуре метода не нужно. Неконтролируемые исключения указываются в сигнатуре метода, если они в этом методе не обрабатываются.
25

Создание собственных исключений
Таблица3. Методы класса Throwable :
26

Создание собственных исключений
Классы встроенных исключений в Java описывают только наиболее общие ошибки, поэтому в некоторых случаях нужно или полезно описать собственное исключение. В Java такая возможность имеется.
Технически создание собственного исключения сводится к созданию подкласса класса Exception, который, в свою очередь, является подклассом класса Throwable. В создаваемом подклассе ничего не нужно реализовывать. Что касается класса Exception, то он не определяет собственных методов, а наследует их из классаThrowable. Некоторые методы класса Throwable представлены в табл. 3.
27

Создание собственных исключений
• Пример 8. Создание собственного класса исключения
28

Создание собственных исключений
• Пример 8. Создание собственного класса исключения
29

Создание собственных исключений
В программе описывается класс пользовательского исключения MyException, который наследует класс Exception. У класса есть три закрытых поля: поля min и max типа double и поле error, являющееся объектом класса String. Также в классе переопределяется метод toString(). В качестве результата методом возвращается текстовая строка, в которой содержится информация всех трех полей класса.
В главном методе программы определяется статический метод MyLog() с аргументом типа double. В качестве результата метод возвращает значение типа double. Метод описан как способный выбрасывать исключение пользовательского класса MyException.
В теле метода для значения аргумента x вычисляется натуральный логарифм по формуле:
ln( x ( x −1)) .
Если аргумент, переданный методу MyLog(), лежит вне пределов диапазона [0, 1] , методом возвращается значение Math.log(x*(x-1)) (в этой команде имеет место обращение к статическому методу вычисления натурального логарифма log(), описанному в классе Math). Если же аргумент метода MyLog() попадает в диапазон [0, 1] , приведенное выражение вычислено быть не может, поскольку у натурального логарифма аргумент отрицательный. В этом случае методом MyLog() генерируется и выбрасывается исключение пользовательского типа MyException. Аргументами конструктору при этом передаются границы диапазона [0 , 1] и описание ошибки (неверный аргумент).
В главном методе программы выполняется попытка вычислить значение методом MyLog() и вывести его на экран. При этом отслеживается возможность появления исключения класса MyException. В случае если соответствующая ошибка возникает, выполняется ее обработка, которая состоит в том, что на экран выводится описание объекта исключения. Этот объект передается методу println() в блоке catch, а наблюдаемый при этом результат отражает способ переопределения метода toString() в классе MyException.
30