суббота, 25 июня 2016 г.

A programmer: Java #3: Exceptions

Я договорился-таки о прохождении тестирования по Java, причем у меня еще есть неделя для подготовки. Плюс уточнил, что будет на тестировании:
 - ООП;
 - Основы Java;
 - Ввод/вывод;
 - Коллекции;
 - Многопоточность;
 - SQL.

При этом последние два дня застрял на обработке исключений. Итак, что это такое?

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

Когда происходит ошибка в методе, создается "объект исключения" (exception object), содержащий информацию об ошибке (метод "бросает исключение" (throwing an exception)), и система ищет метод, который может исправить ситуацию ("обработчик исключений" (exception handler)). Этот метод представляет собой блок кода, в котором записано, что нужно делать в данном случае. Это происходит следующим образом:

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

 - Система просматривает call stack в обратном порядке (от последнего к самому первому), ища совпадение типа объекта исключения с типом, указанном в обработчике.

 - Когда совпадение найдено, система (JVM) передает управление в соответствующим метод. Если нужный метод не найден, то выполнение системы и программы прекращается (часто - с выводом call stack'а на экран).

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

Для идентификации исключений в Java существует набор классов, описывающих их. Высший класс в иерархии - Throwable, (java.lang.Throwable) остальные наследуются от него. Его прямыми наследниками являются классы  Exception и Error, от которых унаследованы все остальные исключения, также от них можно наследовать собственные классы исключений.

Эти классы отличаются тем, что в классе Exception описаны проверяемые исключения (checked - те, которые зависят от программы), а в Error - не проверяемые (unchecked). Однако, существуетодин наследник класса Exception, который описывает непроверяемые исключения - класс RuntimeException (исключения времени выполнения).

Что касается программы действий в каждом случае exception handler'а), есть три способа ее задать.

Первый вариант - поместить метод, в котором предполагается исключение, в блок try {}, после которого расположить один или несколько блоков catch (ТипИсключения объектИсключения) {}, внутри которых содержится нужная инструкция. Выражение в круглых скобках означает, что если тип объектаИсключения совпадает с ТипомИсключения, то выполняется именно этот catch. ТипИсключения - это один из упомянутых раньше классов. Поскольку если найден нужный catch, остальные не выполняются, то блоки catch должны располагаться в последовательности от наименее общего в иерархии к наиболее общему - чтобы могла быть обработана на наиболее специфичном уровне.

Если некоторый код программы должен быть выполнен в любом случае, то он помещается в блок finally {} после всех catch'ей. Также после try можно в круглых скобках указать ресурс (обычно поток), который обязательно должен быть закрыт в случае ошибки, чтобы не происходило утечки ресурсов - опция доступная в 7 и 8 версих Java.

Второй вариант - указать возможные типы ошибок в сигнатуре самого метода с помощью ключевого слова throws. Это будет означать передачу обработки исключения в данном методе в метод, который его вызвал. Соответственно, в том методе должна быть конструкция try-catch или throws.

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

Отличный материал по теме есть здесь.
Полезно также читать официальные The Java Tutorials.
Коротко и ясно написано также здесь.
Вопросы и ответы для собеседования по исключениям в Java есть здесь.

А еще нашел сайт с тестами по Java. Отдельно теста по исключениям там нет, но в целом интересно. Разумеется, с ответами, объяснением и обсуждениями.

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


P.S.: И еще пару ресурсов:

"Как стать профессиональным разработчиком: практическое руководство"

"Качественный код - слагаемые"

Комментариев нет: