Я договорился-таки о прохождении тестирования по Java, причем у меня еще есть неделя для подготовки. Плюс уточнил, что будет на тестировании:
- ООП;
- Основы Java;
- Ввод/вывод;
- Коллекции;
- Многопоточность;
- SQL.
При этом последние два дня застрял на обработке исключений. Итак, что это такое?
Исключение (Exception) - это событие, которое прерывает нормальную работу программы (попытка деления на ноль, попытка обратиться к элементу массива, который не существует, обращение к несуществующему файлу и т.д.).
Когда происходит ошибка в методе, создается "объект исключения" (exception object), содержащий информацию об ошибке (метод "бросает исключение" (throwing an exception)), и система ищет метод, который может исправить ситуацию ("обработчик исключений" (exception handler)). Этот метод представляет собой блок кода, в котором записано, что нужно делать в данном случае. Это происходит следующим образом:
- Формируется упорядоченный список возможных методов, которые должны быть вызваны в случае ошибки (call stack) - от самого абстрактного метода до того, в котором произошла ошибка. В каждом из этих методов описывается тип ошибки, которую он может обработать.
- Система просматривает call stack в обратном порядке (от последнего к самому первому), ища совпадение типа объекта исключения с типом, указанном в обработчике.
- Когда совпадение найдено, система (JVM) передает управление в соответствующим метод. Если нужный метод не найден, то выполнение системы и программы прекращается (часто - с выводом call stack'а на экран).
Для того, чтобы программа по возможности не зависела от ошибок и "знала, что делать", стараются заранее описать возможные ошибки (их типы) и программу действий в каждом случае.
Для идентификации исключений в Java существует набор классов, описывающих их. Высший класс в иерархии - Throwable, (
Эти классы отличаются тем, что в классе 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.: И еще пару ресурсов:
"Как стать профессиональным разработчиком: практическое руководство"
"Качественный код - слагаемые"
- ООП;
- Основы 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.: И еще пару ресурсов:
"Как стать профессиональным разработчиком: практическое руководство"
"Качественный код - слагаемые"
Комментариев нет:
Отправить комментарий