JavaRush/Курсы/Java Collections/иерархия исключений, errors

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

Открыта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

— Это какие?

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

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

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

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

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

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

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

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

Комментарии (36)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Ra
Уровень 19
Student
28 июля 2023, 08:49
Имхо такая концепция обучения лучше будет: изучаем всё последовательно, а в конце повторяем (с ссылкой на пройденную теорию) все не очевидные вещи, сложные вещи, редкие быстро забывающиеся вещи. Например, сжато, самые тёмные места по таким вещам: дженерики, внутренние классы, только самые крупные нюансы ООП, база многопотока без углубления в библиотеки, сериализация, клонирование, аннотации, рефлексия, типы ссылок, компараторы, работа со временем. Наверняка у многих это подзабылось в конце курса. Стримы и потоки например можно поверхностно, в отличие от. Коллекции вроде хорошо запоминаются, можно только нюансы с нуллами и тому подобное. Если уж совсем мечтать, то дать список задач для самостоятельного изучения/повторения. Это не сложно. Задачи по типу чата, практические. Или по темам новых разделов из Универа. CRUD на спринге. Или написать задачу с помощью Guava и Apache Commons. Задачи по многопоточке от профи - вообще был бы шикардос. Задачи на свои коллекции. Написать свои аннотации с практическим применением. (Есть конечно книги типа Анджел Леонард - Java - Решение практических задач (2021), но советов от профи там нет) И не делать 100500 задач типа "создай кучу классов и их объекты" как в начале. А "изучать" exception'ы в конце курса - ну такое.
Anonymous #2615360
Уровень 51
18 сентября 2022, 16:56
еще лучше запомните что сам Throwable - это ПРОВЕРЯЕМОЕ исключение. Никогда не задумывался об этом, хорошо хоть угадал на собесе
hint1k
Уровень 51
16 июня 2023, 15:09
Для тех кому такой морально устаревший вопрос на собесе попадется - спросите в ответ, а нафига это помнить, если среда разработки (IDEA) - это помнит и сама подсказывает - обернуть в трай-кэтч или нет. А если чел, который вас это спросил - не понял. Спросите его/ее зачем вообще нужны компьютеры? (разгрузить мозг человека от ненужной информации и рутинных вычислений). А если и тогда не понимает, то бегите с такой конторы, ничего полезного вы там не выучите.
Ra
Уровень 19
Student
28 июля 2023, 09:58
Желтое и синее - checked, Красное и зелёное - unchecked. Серое игнорить.
ivan дворник
28 июля 2023, 16:23
Класс Throwable в языке программирования Java является базовым классом для всех исключений. он не может быть не checked ни unchecked
Ra
Уровень 19
Student
28 июля 2023, 16:55
Класс Throwable в языке программирования Java является базовым классом для всех исключений. он не может быть не checked ни unchecked > всё, провалил собес 😒
ivan дворник
28 июля 2023, 17:07
можешь привести какие-то пруфы своим словам? может я реально неправ
Ra
Уровень 19
Student
28 июля 2023, 17:11
просто напиши throw new Throwable(); и компилятор скажет своё слово
Ra
Уровень 19
Student
29 июля 2023, 13:09
Да всегда пожалуйста. В Java столько тёмных закоулков, что такого можно тоннами накидать. Особенно во внутренних классах и дженериках. Даже в свитчах и массивах есть нюансы))) надо проверять их на нулл и массивы могут быть нулевой длины. И у i++ заковыристая логика иногда
ivan дворник
29 июля 2023, 13:12
дело не в заковыристой логике. дело в неправильной картинке на 14 уровне 3 лекция (ссылка) я написал комментарий где указал на ошибку. пожалуйста, лайкни его и поставь эмоцию, чтобы как можно больше людей его увидели
Igor Petrashevsky
Уровень 47
27 августа 2022, 21:39
опять мана на ветер
15 августа 2021, 15:48
Меня спрашивали, какие выди есть и привести 2-3 примера)
LuneFoxJava Developer в BIFITExpert
8 марта 2022, 04:02
Куда выди?
Oleg Khilko
Уровень 51
14 августа 2022, 15:51
Так это не должно же составлять большой сложности если к этому процессу подойти на стадии подготовки к собесам и разложить по полочкам как Throwable, так и Iterable (Коллекцию). Тут больше тебя пытаются зацепить на то понимаешь ты когда какая будет или нет. Один раз себе расписать на листочке и выучить👍
LokiLaufeyson
Уровень 41
28 апреля 2021, 14:57
Вообще, третье дано - можно вернуть Optional, и тогда клиентский код сам пусть решает, что делать, если метод не смог что-то сделать
JustinianJudge в Mega City OneMaster
11 февраля 2022, 09:55
Это включено в первое.
Метод либо делает то, для чего он написан, либо кидает исключение. Третьего не дано!
Если задача метода к примеру findById искать энтити, как процесс. Если находит - ок, не находит возвращает энтити. Тогда возвращается Optional, и это абсолютно соотносится с первым подходом "метод делает то, для чего написан - осуществляет ПРОЦЕСС поиска, и ЕСЛИ находит результат, возвращает , ЕСЛИ нет, возвращает пустой опшенал" Возможно переформулировать иначе: метод должен НАЙТИ ! энтити обязательно. Тогда Optional никак не подходит под первый кейс, пустой опшенал это нарушение контракта метода. ТОгда идет второй сценарий - исключение: ЕСЛИ энтити не найдена - ТОГДА бросаю исключение, поскольку метод, не сделал свою работу, ничего не нашел. Поэтому, в этой плоскости, третьего и не дано, Optional это лишь дополнительный инструмент работы с отсутствием значения. Но работа с Optional в принципе относится к первому пункту - это флоу, который программист определяет как корректный. То есть метод может вернуть, может не вернуть и это ок - в этом планt работа с Optional мало чем отличается с методом к примеру, который возвращает либо коллекцию с данными либо пустую коллекцию. Это тоже первый пункт - корректная работа программы. А исключение это другая ситуация, когда мы говорим - метод ОБЯЗАН что-то сделать, если он не сделал - бросаем исключение здесь и сейчас.
Алексей Мирный Backend Developer
18 января 2021, 10:31
Был на собесе месяц назад, не спрашивали =)
alex_usJava Developer в BFT
30 января 2021, 12:29
а что на собесах спрашивают? и устроился ты ?) если не секрет конечно
Алексей Мирный Backend Developer
5 февраля 2021, 18:14
После всей этой теории, перешли к практике logg, дебаг, XML итд, сказал как есть...) пока на стажbровке от JR
alex_usJava Developer в BFT
5 февраля 2021, 18:37
на многих собесах был?)
Алексей Мирный Backend Developer
8 февраля 2021, 05:13
На одном))
alex_usJava Developer в BFT
8 февраля 2021, 06:40
а почему так?)
Алексей Мирный Backend Developer
8 февраля 2021, 09:27
Решил пока паузу взять в поисках и сосредоточится на стажировке, да и резюме надо переделывать
Алексей Мирный Backend Developer
16 июня 2023, 06:00
Да, первую работу нашел в мае 2021 года, отработал там почти год, сейчас мидлом работаю в крупной компании, осенью буду пробоваться в синьоры подняться.
wokku
Уровень 51
6 сентября 2023, 16:53
Это что, нативная реклама jr стажировки?)
Fl1s Backend Developer
25 марта 2024, 07:03
Похоже на то
Андрей
Уровень 41
10 августа 2019, 14:24
Если не забуду, то отпишусь спросили ли
ДаниилSalesforce Developer в CustomertimesMaster
8 октября 2019, 15:10
Забыл или ещё не ходил?
Андрей
Уровень 41
8 октября 2019, 22:00
Я рассчитывал что напомнят в комментариях, спрашивали
ДаниилSalesforce Developer в CustomertimesMaster
9 октября 2019, 07:23
А в каком объёме ориентировочно?
Андрей
Уровень 41
9 октября 2019, 20:21
Какие бывают, как создать свое исключение (от чего наследовать) и как выбросить (throw new)
ДаниилSalesforce Developer в CustomertimesMaster
9 октября 2019, 20:23
И всё?
Андрей
Уровень 41
10 октября 2019, 19:46
Что еще по этой теме можно спросить?
ДаниилSalesforce Developer в CustomertimesMaster
10 октября 2019, 20:38
Ну что могут спросить...
mila
Уровень 20
26 июня 2018, 21:17
На каждом, Карл!
wan-derer.ru
Уровень 40
17 декабря 2020, 13:50
нэтЪ :)