Типы исключений

Открыта

— Решила поднять сегодня ещё одну тему. В Java все исключения делятся на два типа – контролируемые/проверяемые (checked) и неконтролируемые/непроверяемые (unchecked): те, которые перехватывать обязательно, и те, которые перехватывать не обязательно. По умолчанию – все исключения обязательно нужно перехватывать.

— А можно в коде специально выбрасывать исключения?

— В своем коде ты сам можешь выкидывать исключения. Ты даже можешь написать свои собственные исключения. Но это мы разберем позже. Сейчас же давай научимся работать с исключениями, которые выбрасывает Java-машина.

— Ок.

— Если в методе выбрасываются (возникают) исключения ClassNotFoundException и FileNotFoundException, программист обязан указать их в сигнатуре метода (в заголовке метода). Это checked исключения. Вот как это обычно выглядит:

Примеры
public static void method1() throws ClassNotFoundException, FileNotFoundException
public static void main() throws IOException
public static void main() //не выбрасывает никаких исключений

— Т.е. мы просто пишем throws и перечисляем исключения через запятую. Так?

— Да. Но тут интересно другое. Чтобы программа скомпилировалась, метод, который вызывает method1 в примере ниже, должен сделать две вещи: или перехватить эти исключения или пробросить их дальше (тому, кто его вызвал), указав их в своём заголовке.

— Еще раз. Если ты в методе main хочешь вызвать метод какого-то объекта, в заголовке которого прописано throws FileNotFoundException, … то тебе надо сделать одно из двух:

1) Перехватывать исключения FileNotFoundException, …

Тебе придется обернуть код вызова опасного метода в блок try-catch

2) Не перехватывать исключения FileNotFoundException, …

Тебе придется добавить эти исключения в список throws своего метода main.

— А можно пример?

— Вот, смотри:

Примеры проверяемых (checked) исключений
public static void main(String[] args)
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //тут кинется исключение  FileNotFoundException, такого файла нет
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

— Этот пример не скомпилируется, т.к. метод main вызывает метод method1(), который выкидывает исключения, обязательные к перехвату.

— Чтобы пример скомпилировался, надо добавить обработку исключений в метод main. Сделать это можно двумя способами:

Способ 1: просто пробрасываем исключение выше (вызывающему):
public static void main(String[] args)  throws FileNotFoundException, ClassNotFoundException
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //тут кинется исключение  FileNotFoundException, такого файла нет
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

— А тут перехватываем его с помощью try-catch:

Способ 2: перехватываем исключение:
public static void main(String[] args)
{
    try
    {
        method1();
    }
    catch(Exception e)
    {
    }
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //тут кинется исключение  FileNotFoundException, такого файла нет
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

— Что-то понемногу проясняется.

— Посмотри на пример ниже, чтобы разобраться:

Не обрабатываем исключения – нужно пробросить их дальше, тому, кто знает как
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Обрабатываем одно исключение, второе – пробрасываем:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Перехватываем оба – ничего не пробрасываем:
public static void method4()
{
    try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
    catch (ClassNotFoundException e)
    {
        System.out.println("ClassNotFoundException has been caught.");
    }
}
10
Задача
Java Syntax,  9 уровень,  4 лекция
Недоступна
Набираем код
Внимание! Объявляется набор кода на JavaRush. Для этого включите режим повышенной внимательности, расслабьте пальцы, читайте код и… набирайте его в соответствующем окошке. Набор кода — вовсе не бесполезное занятие, как может показаться на первый взгляд: благодаря ему новичок привыкает к синтаксису и запоминает его (современные IDE редко дают ему это сделать).

— Но есть вид исключений – это RuntimeException и классы, унаследованные от него. Их перехватывать не обязательно. Это unchecked исключения. Считается, что это трудно прогнозируемые исключения и предсказать их появление практически невозможно. С ними можно делать все то же самое, но указывать в throws их не нужно.

Комментарии (85)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Alexandr22 уровень
5 мая, 15:26
"В Java все исключения делятся на два типа – контролируемые/проверяемые (checked)" (ЗЕЛЕНЫЙ) "и неконтролируемые/непроверяемые (unchecked)" (КРАСНЫЙ). Действительно, поменяйте пожалуйста цвета шрифта (checked) на ЖЕЛТЫЙ и (unchecked) на ЗЕЛЕНЫЙ.
Vitaliy15 уровень, Санкт-Петербург
30 апреля, 12:46
Alex40 уровень
3 мая, 11:56
Спасибо, исправим.
Mikhail Kokorin18 уровень, Санкт-Петербург
26 апреля, 09:11
Такое чувство что создатели специально пишут так статьи,что бы они смотрелись так, как будь то их от куда то вырезали и вставили сюда...да еще эти манипуляции с покраской слов в другие цвета как будь то наоборот запутать хотят.
Aeon15 уровень, Санкт-Петербург
31 марта, 18:53
На первой схеме Runtime Exception и его потомки изображены зеленым цветом и в первом же абзаце зеленым написано про "контролируемые/проверяемые (checked)" исключения. А вот уже в конце иначе: "но есть вид исключений – это RuntimeException и классы, унаследованные от него. Их перехватывать не обязательно. Это unchecked исключения". Неужели нельзя по-человечески преподнести материал, чтобы я не тратил время, разбираясь, checked это или все-таки unchecked? Очередная статья, после которой сразу же нужно идти гуглить.
Шкипер16 уровень, Минск
27 марта, 08:41
как быстрее всего набирать код. 1. Открываем Chrome 2. Разворачиваем задание "Набираем код" 3. Фокусируем курсор в поле "Код, который надо повторить:" 4. Жмем CTRL+A (выделение кода не видно, но оно есть =), затем CTRL+C. 5. Фокусируем курсор в поле "Ваш код:" 6. Жмем CTRL+V Если помогло, то ставь лайк!
Семён22 уровень, Екатеринбург
27 марта, 23:38
это нужно для того, чтобы тренироваться набирать код ручками и для усвоения материала, а не для зарабатывания черной материи
Шкипер16 уровень, Минск
28 марта, 11:57
я никого не агитирую пользоваться моей инструкцией, но набрать код, достаточно было на 1-7 уровнях. Сейчас нужно понимание того, что ты делаешь, а IDEA поможет автоматизировать то что ты делаешь. Вы серьезно всё еще вручную описываете конструкцию try-catch? Достаточно выделить в IDE строку и нажать CTRL+ALT+T.
Семён22 уровень, Екатеринбург
28 марта, 12:02
может быть при чтении чужого кода может помочь
Шкипер16 уровень, Минск
28 марта, 12:13
Набирание кода , может помочь при чтении чужого кода? я правильно вас понял?
Семён22 уровень, Екатеринбург
28 марта, 13:29
набирание кода ведет к лучшей запоминаемости и понимания синтаксиса
Шкипер16 уровень, Минск
29 марта, 12:41
facepalm
Kirill Sadovnikov16 уровень, Санкт-Петербург
11 мая, 20:23
1. Открываешь консоль браузера 2. Нажимаешь на кнопку аля набор 3. В запросе после нажатия кнопки прилетит base64 строка с кодом 4. Декодируешь строку и пихаешь в textarea с набором кода 5. PROFIT
Mykola9 уровень, Helsinki
14 июня, 15:42
Слышал что в конце курса черную материю на баксы будут мннять🤣🤣🤣
Oleg Zaytsev24 уровень
2 марта, 22:39
https://javarush.ru/groups/posts/1401-iskljuchenija-i-ikh-obrabotka
Chingis Kyunkrikov10 уровень, Москва
28 февраля, 23:10
В лекции ошибка, на картинке изображены RunTimeException и ее потомки, и выделены они зеленым. Далее написано, что выделенные зеленым - это checked exceptions, хотя они по факту таковыми не являются. Прошу исправить, т.к. из-за этого долго втыкал в лекцию и задачи пытаясь понять что к чему. вот в этой статье намного лучше написано https://javarush.ru/groups/posts/1944-iskljuchenija-checked-unchecked-i-svoi-sobstvennihe . Мб стоит ее смержить с этой лекцией?
S20 уровень, Минск
27 февраля, 15:21
Лекция написана плохо. Где checked, где unchecked - непонятно. Лучше почитать в Head FIrst Java.
Артур24 уровень
17 февраля, 14:35
Не совсем до конца понятно, что такое checked и unchecked исключения. Поясните, пожалуйста.
Максим16 уровень
24 января, 16:56
или перехватить эти исключения или пробросить их дальше (тому, кто его вызвал) указав их в своём заголовке. Что это значит? Что значит перехватывать, а что пробрасывать?
Андрей18 уровень, Новосибирск
1 февраля, 11:15
"Перехватить", значит обработать:
try {...} catch(Exception e) {...}
"Пробросить" - указать в заголовке "throws", предоставив обработку тому методу, который будет вызывать данный
Vgoose16 уровень, Москва
11 февраля, 11:28
В цепочке вызовов методов, один из них, допустим последний, сталкивается с ошибкой\исключением, в итоге у него 2 варианта: 1. Перехватить\поймать\catch эту ошибку и обработать (сделать с ней что-то в теле catch) 2. Ничего с ней не делать и передать\пробросить её методу выше по цепочке, который его вызвал. "Я хз что с этим делать, нате вот вам ошибку, разбирайтесь с ней там выше сами".