Объектно-ориентированное программирование на Java. Платформа Java SE - страница 22



Эту проверку создатели языка оставили программисту на его усмотрение.



Таким образом, исключение RuntimeException является не проверяемым и выбрасывается во время выполнения Java кода, и его дочерние исключения также являются не проверяемыми.

Это исключение IndexOutOfBoundsException – выбрасывается, когда индекс некоторого элемента в структуре данных не попадает в диапазон имеющихся индексов.

Исключение NullPointerException – выбрасывается, когда ссылка на объект, к которому вы обращаетесь, хранит null.

Исключение ClassCastException – это ошибка приведения типов.

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

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

И его дочерние исключения, также не проверяемые, ThreadDeath – вызывается при неожиданной остановке потока.

Исключение StackOverflowError – ошибка переполнение стека. Часто возникает в рекурсивных функциях из-за неправильного условия выхода.

И исключение OutOfMemoryError – ошибка переполнения памяти.

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

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

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

Иными словами, Exception не должен находиться выше ArithmeticException и ArrayIndexOutOfBoundsException.

И еще, операторы try могут быть вложенными.

Если вложенный оператор try не имеет своего обработчика catch для определения исключения, то идёт поиск обработчика catch у внешнего блока try и т. д.

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

Таким образом, проверка на проверяемые исключения происходит в момент компиляции, а перехват исключений блоком catch происходит в момент выполнения кода.



Теперь, есть еще одна конструкция в обработке исключений, это блок finally.

Когда исключение передано, выполнение метода направляется по нелинейному пути.

Это может стать источником проблем.

Например, при входе метод открывает файл и закрывает при выходе.

Чтобы закрытие файла не было пропущено из-за обработки исключения, используется блок finally.

Ключевое слово finally создаёт блок кода, который будет выполнен после завершения блока try/catch, но перед кодом, следующим за ним.

Блок будет выполнен, независимо от того, передано исключение или нет.

Оператор finally не обязателен, однако каждый оператор try требует наличия либо catch, либо finally.

Таким образом, блок finally всегда выполняется, когда блок try завершается.

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

Также блок finally позволяет программисту избежать случайного обхода нужного кода.

Включение необходимого для выполнения кода в блок finally всегда является хорошей практикой, даже если не ожидается никаких исключений.

Однако блок finally не всегда может выполняться.

Если виртуальная машина JVM завершает работу во время выполнения кода try или catch, блок finally может не выполняться.