JavaRush/Курсы/Java Syntax/Как работают исключения

Как работают исключения

Открыта
Как работают исключения - 1

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

Код с использованием исключений
class ExceptionExampleOriginal
{


    public static void main(String[] args)
    {
        System.out.println("main begin");
        try
        {
            System.out.println("main before call");

            method1();



            System.out.println("main after call");
        }
    catch (RuntimeException e)
        {


            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main end");
    }

    public static void method1()
    {
        System.out.println("method1 begin");
        method2();

        System.out.println("method1 end");
    }

    public static void method2()
    {
      System.out.println("method2");
      String s = "Message: Unknown Exception";
     throw new RuntimeException(s);

    }
}
Примерная расшифровка
public class ExceptionExample
{
 private static Exception exception = null;

   public static void main(String[] args)
    {
        System.out.println("main begin");


        System.out.println("main before call");

        method1();

        if (exception == null)
        {
            System.out.println("main after call");
        }
        else if (exception instanceof RuntimeException)
        {
            RuntimeException e = (RuntimeException) exception; exception = null;
            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main end");
    }

    public static void method1()
    {
        System.out.println("method1 begin");
        method2();
        if (exception != null) return;
        System.out.println("method1 end");
    }

    public static void method2()
    {
        System.out.println("method2");
        String s = "Message: Unknown Exception";
        exception = new RuntimeException(s); return;
    }
}

— Ничего не понятно.

— Ок. Давай я тебе объясню, что происходит.

— В примере слева мы по цепочке вызываем несколько методов. В method2 мы специально создаем и выкидываем исключение (инициируем ошибку).

— В примере справа показано, что примерно при этом происходит.

— Посмотри на method2. Создание исключения превратилось вот во что: создали объект типа RuntimeException, сохранили его в специальную переменную exception и тут же вышли из метода – return.

— В методе method1, после вызова method2 стоит проверка – есть исключение или нет, если исключение есть, тогда метод method1 тут же завершается. Такая проверка неявно производится после вызова каждого(!) метода в Java.

— Ого!

— Вот тебе и ого.

— В колонке справа в методе main я написал, что примерно происходит при перехвате исключения с помощью конструкции try-catch. Если исключения не было, то все продолжает работать, как и запланировано. Если исключение было, и оно было такого типа, как указано в catch, тогда мы его обрабатываем.

— А что значит throw и instanceof?

– Посмотри на последнюю строку throw new RuntimeException(s). Таким способом мы создаем и кидаем исключение. Пока мы так делать не будем. Это только для примера.

— А с помощью команды «а instanceof B» мы проверяем, имеет ли объект a тип B. Т.е. имеет ли объект, который хранится в переменной exception, тип RuntimeException. Это логическое условие.

— Ну, вроде понятно. Немного.

9
Задача
Java Syntax Pro Beta,  9 уровень5 лекция
Недоступна
Побитовые операции
Побитовые операции
9
Задача
Java Syntax Pro Beta,  9 уровень5 лекция
Недоступна
Swap по-новому
Swap по-новому
Комментарии (189)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Анна Луханина
Уровень 15
6 июля 2025, 14:13
Здесь не хватает важной информации для понимания. Обработка исключения ≠ выбрасывание исключения throw - выбрасывает исключение. try/catch - обрабатывает его. Если для выброшенного исключения нет try/catch в текущем методе - исключение идёт дальше вверх по стеку, где ищет обработчик
AlinaY
Уровень 20
6 апреля 2023, 09:46
По сравнению с другими лекциями эта написана неразборчиво, несистемно и непонятно. Все объяснение темы изучала на других источниках
Larvixx
Уровень 17
27 февраля 2023, 10:44
— Ого! — Вот тебе и ого.
White Rabbit
Уровень 22
4 октября 2022, 12:12
А почему в приведённом примере method1 не пробрасывает исключение наверх, в main?
ivankoffpavel
Уровень 19
20 июля 2023, 04:07
V main est block try - cath kotorij obrabativaet
worried-cell
Уровень 24
28 августа 2022, 05:37
Уровень лекции крайне высок для текущего уровня) И это хорошо)
xxxx
Уровень 23
11 января 2023, 10:37
мало понятного. и это плохо
Lo
Уровень 35
Expert
11 июля 2023, 11:20
Читала эту лекцию после книжки Шилдта, как по маслу))) он так разжевал про исключения, просто слов нет! Единственное что я заметила отличие, в его книге переменная называется exc, а тут просто е, наверно изменили в новой версии Java,в книге описывали Java8.
Максим
Уровень 22
Expert
26 сентября 2023, 15:55
вы можете называть обьект как угодно,главное чтобы он был обьектом класса конкретной ошибки или же общего родителя (Exception)
Lo
Уровень 35
Expert
29 сентября 2023, 11:09
спасибо, я почему то думала,что эта переменная уже создана и я к ней общаясь, а не создаю сама. Поэтому меня удивило,что по разному написанно. Ну это было пару месяцев назад, сейчас я более менее разобралась с исключениями.
Максим
Уровень 22
Expert
29 сентября 2023, 12:16
Это хорошо,удачи вам в обучении!)
Евгений N
Уровень 23
20 апреля 2022, 08:57
как расширить таблички с кодом? при уменьшении масштаба таблички тоже уменьшаются! 😢 в итоге справа слева по 10 см пустые поля, а код в табличках не помешается - требует горизонтальной прокрутки, которая снизу и уже даже не видна (требуется сначала вертикальная прокрутка) 😢 😢
Roman Kharitonov Backend Developer Expert
3 июля 2022, 23:28
Как вариант, проинспектировать элемент, найти div class="row compare" и задать ему явно ширину в 1600 пикселей.
style="width: 1600px;"
Nikita Prokaev
Уровень 23
14 июля 2022, 15:19
Расширить, без танцев с бубном, никак. Тебе поможет Shift + колесо мыши.
Евгений N
Уровень 23
18 июля 2022, 12:41
Shift + колесо мыши = просто сдвиг текста влево-вправо = стрелки влево-вправо, удобнее конечно чем за горизонтальный ползунок снизу тягать, но пустое место на экране не используется 😂 . Браузеры: Яндекс, Хром.
Максим
Уровень 23
24 августа 2022, 09:40
Здорово!!! спс:)
АлександрTechnical Lead в МДР
8 декабря 2021, 10:57
method2 не скомпилируется в правом примере, он void - там не может быть возврат значений return )))
RuvinoSoftware Developer в Европлан
12 января 2022, 13:34
Насколько я знаю, в этом случае "return" выступает как "break" в цикле. В Богоподобной одинэсинке в процедурах (которые ничего не возвращают), можно писать ключевое слово "возврат". Код просто прекратит работать.
WriturX [Andrij] Backend Developer
19 января 2022, 21:05
Опять таки, можно. Проверяйте! =) только после слова return ставьте сразу точку с запятой и никакого значения больше. Вы будете удивлены)
Aleksei Reinsalu
Уровень 19
20 ноября 2021, 09:44
Оно вроде бы и просто если брать задействованный программный язык, но проясняет ход мыслей программистов со стажем и о чем они говорят на своем жаргоне.
gypsy potassium
Уровень 19
Expert
15 сентября 2021, 15:40
Всё бы хорошо, но хочется чтобы сайт, обучающий программированию мог подстраиваться под ширину экрана. Сижу на 22 дюймовом монике, пол-экрана пустые. Зато материал в узеньких полях, которые надо вправо-влево двигать. 👍
Вилюян
Уровень 11
26 декабря 2021, 05:51
согласен, исправили бы они это
Евгений N
Уровень 23
20 апреля 2022, 09:01
"которые надо вправо-влево двигать" до 29 строк еще ничего, "двигалка" на том же листе, а здесь сначала надо до нее прокрутиться, потом сдвинуть, потом прокрутить назад.
25 июня 2022, 22:32
Друзья, используйте стрелочки на клавиатуре)
Евгений N
Уровень 23
27 июня 2022, 10:42
частично стрелочки помогают, но всё равно не особо, к тому же они не передвигают оба окна, как в программах-сравнялках текста (Merge и т.п.)! ну и это абсурдно, что-то двигать, когда слева справа пустые поля по 40% от окон с текстом.
Инна
Уровень 29
25 августа 2021, 14:25
а почему в примере того, как всё работает, выход из метода это return? В void методе и без значения
za4emyavam
Уровень 37
31 августа 2021, 15:07
Если требуется выйти из метода досрочно - можно использовать return без значения. А в данном случае это только пример, что после throw идёт сразу выход из метода.