— Привет, Амиго!

— Привет, Элли! Как жизнь?

— Отлично, спасибо. А ты как?

— Супер, сегодня утром столько всего нового рассказали.

— Так это же отлично. Не устал?

— Да, есть такое дело. Подустал немного.

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

— Маленькую и легкую? Я готов.

— Сегодня мы с тобой детально разберем тему исключений — Exception.

— Ты про обработку ошибок?

— Считать исключение ошибками – это неверный подход. Исключения больше похожи на отчет о том, «что пошло не так». На основе которого можно предложить альтернативные сценарии действия.

Все дело в методах. Когда ты вызываешь какой-то метод, он гарантированно должен сделать то, для чего его вызвали.

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

Т.е. самое худшее, что может случиться – это когда метод не выполнил свою работу, и никого об этом не уведомил. Хуже этого не может быть ничего. Это потеря контроля над ситуацией.

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

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

С точки зрения программиста, если в программе произошел сбой, и она закрылась – это в тысячу раз лучшая ситуация, чем, если в программе произошел сбой, она работает неправильно и пользователь об этом не подозревает.

— Как то, что программа что-то показывает неправильно, может быть хуже, чем, если программа закрылась, и все данные потерялись?

— А с чего ты взял, что программа просто что-то неправильно показывает? Может у нее внутри куча ошибок и все данные твоей работы с ней будут безвозвратно потеряны? Ты 3 часа набирал текст, который не сохранится, потому что на второй минуте работы произошла ошибка.

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

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

Ты можешь не обрабатывать исключения, и тогда — ты плохой программист. Но если твои методы не выкидывают исключений, тогда ты вообще не программист, т.к. так и не понял простой истины:

Метод либо делает то, для чего он написан, либо кидает исключение. Третьего не дано!

— Ладно, верю. Обещаю пользоваться исключениями.

— Отлично. Тогда давай я тебе расскажу про иерархию исключений:

иерархия исключений, errors - 1

Иерархия исключений базируется на четырех классах.

Самый базовый класс – это Throwable.

От него унаследованы классы Error и Exception.

От Exception унаследован RuntimeException.

Класс Error является базовым классом для ошибок Java-машины, таких как StackOverFlowOutOfMemory, …

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

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

Класс Exception является базовым для всех обычных исключений, которые выбрасываются программой. RuntimeException – это подкатегория исключений Exception, к которым применяются немного другие правила.

— Это какие?

— Как раз сейчас и расскажу.

Как ты, наверное, помнишь, исключения делятся на две категории checked (проверяемые) и unchecked (непроверяемые).

Если метод выкидывает checked исключения, то вызывающий его метод обязан обернуть вызов такого метода в блок try-catch. Ну, или пробросить исключение выше (своему вызывающему), явно указав его в списке throws в сигнатуре метода.

На unchecked такие правила/ограничения не распространяются.

Так вот, все исключения, унаследованные от Exception, считаются checked. Кроме исключений, которые унаследованы от RuntimeException – они  unchecked.

— Ага. Вспоминаю, что-то такое мне уже раньше рассказывали.

— Амиго! Иерархию исключений спрашивают на каждом собеседовании. Еще раз – на каждом. Ты должен великолепно знать эту тему.

— Ок. Я еще раз все перечитаю и разберусь. Спасибо, что помогаешь мне, Элли.