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

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

Java Collections
8 уровень , 3 лекция
Открыта

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

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

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

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

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

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

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

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

— Сегодня мы с тобой детально разберем тему исключений — 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.

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

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

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

Комментарии (36)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ra Уровень 13 Student
28 июля 2023
Имхо такая концепция обучения лучше будет: изучаем всё последовательно, а в конце повторяем (с ссылкой на пройденную теорию) все не очевидные вещи, сложные вещи, редкие быстро забывающиеся вещи. Например, сжато, самые тёмные места по таким вещам: дженерики, внутренние классы, только самые крупные нюансы ООП, база многопотока без углубления в библиотеки, сериализация, клонирование, аннотации, рефлексия, типы ссылок, компараторы, работа со временем. Наверняка у многих это подзабылось в конце курса. Стримы и потоки например можно поверхностно, в отличие от. Коллекции вроде хорошо запоминаются, можно только нюансы с нуллами и тому подобное. Если уж совсем мечтать, то дать список задач для самостоятельного изучения/повторения. Это не сложно. Задачи по типу чата, практические. Или по темам новых разделов из Универа. CRUD на спринге. Или написать задачу с помощью Guava и Apache Commons. Задачи по многопоточке от профи - вообще был бы шикардос. Задачи на свои коллекции. Написать свои аннотации с практическим применением. (Есть конечно книги типа Анджел Леонард - Java - Решение практических задач (2021), но советов от профи там нет) И не делать 100500 задач типа "создай кучу классов и их объекты" как в начале. А "изучать" exception'ы в конце курса - ну такое.
Anonymous #2615360 Уровень 51
18 сентября 2022
еще лучше запомните что сам Throwable - это ПРОВЕРЯЕМОЕ исключение. Никогда не задумывался об этом, хорошо хоть угадал на собесе
hint1k Уровень 51
16 июня 2023
Для тех кому такой морально устаревший вопрос на собесе попадется - спросите в ответ, а нафига это помнить, если среда разработки (IDEA) - это помнит и сама подсказывает - обернуть в трай-кэтч или нет. А если чел, который вас это спросил - не понял. Спросите его/ее зачем вообще нужны компьютеры? (разгрузить мозг человека от ненужной информации и рутинных вычислений). А если и тогда не понимает, то бегите с такой конторы, ничего полезного вы там не выучите.
Ra Уровень 13 Student
28 июля 2023
Желтое и синее - checked, Красное и зелёное - unchecked. Серое игнорить.
ivan Уровень 40
28 июля 2023
Класс Throwable в языке программирования Java является базовым классом для всех исключений. он не может быть не checked ни unchecked
Ra Уровень 13 Student
28 июля 2023
Класс Throwable в языке программирования Java является базовым классом для всех исключений. он не может быть не checked ни unchecked > всё, провалил собес 😒
ivan Уровень 40
28 июля 2023
можешь привести какие-то пруфы своим словам? может я реально неправ
Ra Уровень 13 Student
28 июля 2023
просто напиши throw new Throwable(); и компилятор скажет своё слово
Ra Уровень 13 Student
29 июля 2023
Да всегда пожалуйста. В Java столько тёмных закоулков, что такого можно тоннами накидать. Особенно во внутренних классах и дженериках. Даже в свитчах и массивах есть нюансы))) надо проверять их на нулл и массивы могут быть нулевой длины. И у i++ заковыристая логика иногда
ivan Уровень 40
29 июля 2023
дело не в заковыристой логике. дело в неправильной картинке на 14 уровне 3 лекция (ссылка) я написал комментарий где указал на ошибку. пожалуйста, лайкни его и поставь эмоцию, чтобы как можно больше людей его увидели
Igor Petrashevsky Уровень 47
27 августа 2022
опять мана на ветер
Олег Вербецкий Уровень 41
15 августа 2021
Меня спрашивали, какие выди есть и привести 2-3 примера)
LuneFox Уровень 41 Expert
8 марта 2022
Куда выди?
Oleg Khilko Уровень 51
14 августа 2022
Так это не должно же составлять большой сложности если к этому процессу подойти на стадии подготовки к собесам и разложить по полочкам как Throwable, так и Iterable (Коллекцию). Тут больше тебя пытаются зацепить на то понимаешь ты когда какая будет или нет. Один раз себе расписать на листочке и выучить👍
LokiLaufeyson Уровень 41
28 апреля 2021
Вообще, третье дано - можно вернуть Optional, и тогда клиентский код сам пусть решает, что делать, если метод не смог что-то сделать
Justinian Уровень 41 Master
11 февраля 2022
Это включено в первое.

Метод либо делает то, для чего он написан, либо кидает исключение. Третьего не дано!
Если задача метода к примеру findById искать энтити, как процесс. Если находит - ок, не находит возвращает энтити. Тогда возвращается Optional, и это абсолютно соотносится с первым подходом "метод делает то, для чего написан - осуществляет ПРОЦЕСС поиска, и ЕСЛИ находит результат, возвращает , ЕСЛИ нет, возвращает пустой опшенал" Возможно переформулировать иначе: метод должен НАЙТИ ! энтити обязательно. Тогда Optional никак не подходит под первый кейс, пустой опшенал это нарушение контракта метода. ТОгда идет второй сценарий - исключение: ЕСЛИ энтити не найдена - ТОГДА бросаю исключение, поскольку метод, не сделал свою работу, ничего не нашел. Поэтому, в этой плоскости, третьего и не дано, Optional это лишь дополнительный инструмент работы с отсутствием значения. Но работа с Optional в принципе относится к первому пункту - это флоу, который программист определяет как корректный. То есть метод может вернуть, может не вернуть и это ок - в этом планt работа с Optional мало чем отличается с методом к примеру, который возвращает либо коллекцию с данными либо пустую коллекцию. Это тоже первый пункт - корректная работа программы. А исключение это другая ситуация, когда мы говорим - метод ОБЯЗАН что-то сделать, если он не сделал - бросаем исключение здесь и сейчас.
Алексей Мирный Уровень 41
18 января 2021
Был на собесе месяц назад, не спрашивали =)
alex_us Уровень 20
30 января 2021
а что на собесах спрашивают? и устроился ты ?) если не секрет конечно
Алексей Мирный Уровень 41
5 февраля 2021
После всей этой теории, перешли к практике logg, дебаг, XML итд, сказал как есть...) пока на стажbровке от JR
alex_us Уровень 20
5 февраля 2021
на многих собесах был?)
Алексей Мирный Уровень 41
8 февраля 2021
На одном))
alex_us Уровень 20
8 февраля 2021
а почему так?)
Алексей Мирный Уровень 41
8 февраля 2021
Решил пока паузу взять в поисках и сосредоточится на стажировке, да и резюме надо переделывать
Алексей Мирный Уровень 41
16 июня 2023
Да, первую работу нашел в мае 2021 года, отработал там почти год, сейчас мидлом работаю в крупной компании, осенью буду пробоваться в синьоры подняться.
wokku Уровень 51
6 сентября 2023
Это что, нативная реклама jr стажировки?)
Fl1s Уровень 51
25 марта 2024
Похоже на то
Андрей Уровень 41
10 августа 2019
Если не забуду, то отпишусь спросили ли
Даниил Уровень 41 Master
8 октября 2019
Забыл или ещё не ходил?
Андрей Уровень 41
8 октября 2019
Я рассчитывал что напомнят в комментариях, спрашивали
Даниил Уровень 41 Master
9 октября 2019
А в каком объёме ориентировочно?
Андрей Уровень 41
9 октября 2019
Какие бывают, как создать свое исключение (от чего наследовать) и как выбросить (throw new)
Даниил Уровень 41 Master
9 октября 2019
И всё?
Андрей Уровень 41
10 октября 2019
Что еще по этой теме можно спросить?
Даниил Уровень 41 Master
10 октября 2019
Ну что могут спросить...
mila Уровень 20
26 июня 2018
На каждом, Карл!
wan-derer.ru Уровень 40
17 декабря 2020
нэтЪ :)