JavaRush /Курсы /Java Syntax /Типы исключений

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

Java Syntax
9 уровень , 4 лекция
Открыта
Типы исключений - 1

— Решила поднять сегодня ещё одну тему. В 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.");
    }
}
9
Задача
Java Syntax Pro, 9 уровень, 4 лекция
Недоступна
Обратный отсчет
В классе Solution в методе countDown() происходит обратный отсчет. Тебе нужно сделать так, чтобы между выводом текста в консоль была пауза в 1 секунду. В этом тебе поможет метод sleep(long) класса Thread.

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

9
Задача
Java Syntax Pro, 9 уровень, 4 лекция
Недоступна
Counter
В классе Solution реализуй метод printNumbers(), который выводит числа от 1 до 10 включительно с паузой между выводом каждого числа - 1,3 миллисекунды. В этом тебе поможет метод sleep(long, int) класса Thread.
9
Задача
Java Syntax Pro, 9 уровень, 4 лекция
Недоступна
Таймер
В классе Solution реализуй метод setTimer(int, int, int, int, int), который засыпает на определенное время, используя соответствующие методы java.util.concurrent.TimeUnit.
Комментарии (200)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Rolik Уровень 41
22 марта 2023
RuntimeException и классы, унаследованные от него. Их перехватывать не обязательно. Это unchecked исключения. Здесь явно неточность. Дальше задача на перехват ArithmeticException - подкласс RuntimeException. Не перехватываются только ошибки - Error и его подклассы.
Emil Issabekov Уровень 16
31 января 2023
Мне кажется цвета лучше поменять, труднопронозируемые сделать зелеными, а обязательные - красными на картинке. И еще не понятно из объяснения почему надо методу main пробрасывать, почему он "умеет" их обрабатывать без необходимости обёртывания, а метод 1 хоть и имеет те же исключения в сигнатуре, но в нем они не обрабатываются.
4 ноября 2022
А вот если исключение не обязательное к прописыванию в сигнатуре, но обрабатывать его в текущем методе я не хочу, то можно его писать в блоке throws? Пойду проверю..
Grock Уровень 44
14 сентября 2022
Друзья, поясните, пожалуйста: 1) try-catch - на первый взгляд, интуитивно понятно для чего - узнать какое исключение выдает (если выдает) конкретная строка кода. То бишь try-catch полезная штука для диагностики; 2) А в вот throws в сигнатуру метода зачем указывать? Чтобы просто пропустить ошибку и обеспечить работу программы дальше? С ошибкой? Не устраняя ее? Но как так, зачем создавать условие работы программы с ошибкой? Разве ошибки не нужно устранять? Подскажите, пожалуйста, знатоки ответ на п. 2.. да и на п. 1, если понимание неверное / неполное?
Benjam1nBTN Уровень 24
17 сентября 2022
Отсортируй комменты по популярности - в самом популярно всё подробно описано
Grock Уровень 44
18 сентября 2022
Точняк! Спасибо, бро :)
Ihor Уровень 13
5 августа 2022
А зачем указывать в сигнатуре метода исключения?
Aleksei Reinsalu Уровень 19
20 ноября 2021
Картинку сохраните. Пригодится.
Aleksei Reinsalu Уровень 19
20 ноября 2021
То есть если нам дали дописывать программу, где main бросает какие-то исключения валидатору, то делать проверку на них в своем коде нужно только когда этого прямо требуют условия задачи. Ну или когда еще какие-то причины есть. А по умолчанию программа с ними продолжит работать.
Игорь Уровень 1
15 августа 2021
Правильно ли я понял? Программист должен предугадать , что может наворотить пользователь , или он сам и прописать все возможные ошибки в try, catch. Если же талантливый пользователь умудриться сделать что то не прописанное в try, catch программа свалиться с выбросом stack trace. и придется в логах искать с каким исключением свалилась программа и дописывать это исключение в try, catch.
Zhulien Уровень 16
22 июня 2022
верно, для предугадывания действий юзера существуют тестеры. Ну или будет тикет на хотфикс))
Komarov Anton Уровень 12
14 июля 2021
У меня возник вопрос касательно throw и я задал его моему другу программисту: - Объясни, я понимаю про try, catch и для чего они нужны, один проверяет, второй работает с исключениями. Но! А для чего нам "выбрасывать" через throw в сигнатуре метода исключения выше по программе? Почему нельзя сразу прописать в методе, где появляется исключение, блок try/catch и всё? - Давай представим что мы с тобой работаем в фирме по изготовлению книг. Ты мой босс, а я рабочий. (Босс - это родительский класс, рабочий - унаследованный). Ты как босс говоришь (вызываешь метод) рабочему изготовить 10 книг. Я начинаю выполнять задачу (метод makeBook), и на 7 книге у меня кончаются скрепки для сшивания листов. В реальной жизни рабочий не будет решать сам эту проблему, а доложит о ней начальству, мол так и так, скрепок нет, выполнить задачу не могу. Вот и в программах бывает так, что некоторые исключения нужно вернуть выше по коду, пускай босс сам с ней разбирается =) Надеюсь кому-то для понимания будет полезно. =)
Евгений N Уровень 23
20 апреля 2022
нее.. непонятно. исключения срабатывают сразу и босс сразу же узнает о проблеме автоматически, без пробрасывания ошибки через через throw! плохой программист у тебя ! 😁 более близко так: так как у рабочего в сигнатуре прописано исключение "отсутствие скрепок", босс заранее должен у себя предусмотреть обработку "отсутствие скрепок", если бы мы не прописали ошибку в сигнатуре метода, боссу пришлось бы в авральном порядке решать проблему. но в целом же преднамеренный проброс исключений решается out-переменной "код ошибки". ах в java же нет out-переменных, ну тогда мы добавим throws 😁😁
Иван Уровень 23
18 июля 2022
Антон, спасибо за объяснение. И Вам Евгений.
Константин Уровень 23
14 февраля 2023
Евгений, но если мы делегируем полномочия классу "рабочий" взять у объекта "склад" в случае такой ошибки скрепок, зачем пробрасывать эту ошибку? тогда класс "босс" и не узнает. Антон приводит пример, когда рабочему низя самому выписывать себе скрепки, ну или как это модно говорить "мне за это не платят" ))))
Komarov Anton Уровень 12
13 июля 2021
https://javarush.com/groups/posts/1943-iskljuchenija-perekhvat-i-obrabotka - Джава раш подробно и ПОНЯТНО