Error

Модуль 1. Java Syntax
23 уровень , 2 лекция
Открыта

Error-ов бояться – на джаве не писать! Наверное, ты уже кое-что знаешь об исключениях в Java. Сегодня хотя бы поверхностное знание тебе пригодится: мы будем разбирать класс Error и особый тип исключений, который многих “пугает”, появляясь в их Стектрейсах.

Во главе иерархии исключений в Java стоит класс Throwable, у которого есть два наследника:

  • Exception, который отвечает за ошибки в системе.
  • И наш сегодняшний герой — Error, который отвечает за ошибки JVM.
    Стоит сказать, что это скорее даже не ошибки, а проблемы, которые обычно не зависят от разработчика.

Что делать с Error

Отлавливая “эрроры”, выполнить какие-либо действия в блоке catch, кроме логирования, тебе не удастся, так как это проблемы самой JVM.

Логирование — хорошее дело: получив ошибку во время выполнения программы, ты можешь посмотреть в логи, увидеть причину поломки и знать, что исправлять.

Так как ты не знаешь, какой error можешь получить, создавая свой код, вписывать в блок catch какой-то конкретный тип нет смысла. Использовать сам класс Error — тоже не самое удачное решение: в таком случае будешь ловить только ошибки.

Поэтому лучше использовать класс Throwable, который может поймать и исключения типа Error, и Exception. Как это выглядит на практике?

Так писать не ОК:

try {
    //Твой код
} catch (OutOfMemoryError outOfMemoryError) {
    //Код для отловки OutOfMemoryError
}
Так писать —тоже не ОК:

try {
    //Твой код
} catch (Error error) {
    //Код для отлова всех Error
}
А вот так писать — ОК:

try {
    //Твой код
} catch (Throwable throwable) {
    //Код для отлова всех Throwable
}

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

Распространенные error-ы

Одни из самых популярных эрроров — классы OutOfMemoryError и StackOverflowError.

OutOfMemoryError часто появляется в тех случаях, когда программе не хватает места для создания объектов, сборщик мусора обработать не успевает, и как результат – OutOfMemoryError.

В Java ты не можешь контролировать удаление объектов, чтобы предотвратить утечки памяти, но ты можешь не мусорить, чтобы не давать лишней работы Garbage Collector-у и не засорять heap (кучу).

Например, такого типа код будет порождать много мусора в памяти:


while (true) {
    new Object();
}

Вторая ошибка, о которой хочу тебе рассказать, — это StackOverflowError: выбрасывается в случаях, когда переполняется стек. Так как стек в основном хранит локальные переменные, параметры и вызовы методов, очень частой причиной этого является рекурсия, или рекурсивный вызов метода:


public void foo() {
    foo();
}

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

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

Разница между исключениями типа Error и Exception

Error Exception
Нельзя исправить в блоке catch Можно обработать в блоке catch
Не появится во время компиляции Можно словить на этапе компиляции
Проблемы JVM Проблемы логики кода
Все Error unchecked checked и unchecked

Без исключений в Java никак, но бояться их не стоит. Просто нужно понимать, что обозначает каждый из типов, и знать, как их обрабатывать. На сегодня это все. Увидимся!

Комментарии (24)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Vasiliy Emelin Уровень 25
1 декабря 2024
тушите свет
Max Уровень 93
8 декабря 2024
Ох, не жданчик 😀 Быстренько пробежимся по теме, всего-то на полтора часика ⌚
Олег Уровень 106 Expert
5 июня 2024
Ну очень тяжело, честно говоря.
Денис Уровень 68
7 декабря 2024
Но это того стоило, глядя с уровня 106 ).
jvatechs Уровень 111 Expert
12 декабря 2022
/* Комментарий удален */
Алексей Уровень 24 Expert
15 декабря 2022
мне кажется год не пишет в комментарии. Стал программистом?
jvatechs Уровень 111 Expert
15 декабря 2022
пишет, пишет) хотелось бы конечно стать программистом за 4 дня, но увы и ах:)
Dmitrijs Papakuls Уровень 92 Expert
18 июня 2023
стал программистом ?
Станислав Уровень 83 Expert
18 июня 2023
Стал программистом? =)
5 июля 2023
Бытует легенда, что он ушел в эскорт, так как это проще
Serge Menko Уровень 58
29 августа 2024
стал программистом ?
Александр Ф Уровень 1
18 февраля 2025
Стал программистом? :)
Marina Rossa Уровень 88
12 мая 2022
Спросите у меня через полгода, стала ли я программистом
2 июня 2022
В Августе уже джуном должна стать
Владимир Уровень 108
10 августа 2022
ну шо? 5 месяцев есть
Дарья Уровень 109
22 августа 2022
ждём ноября! =)
jvatechs Уровень 111 Expert
12 декабря 2022
Марина, стала ли ты программистом?
Николай Уровень 70 Expert
12 декабря 2022
уже 9 месяцев прошло, ну как там дела обстоят?
Руслан Уровень 115
7 декабря 2023
Прошло много времени и ответа не получили поэтому спрошу снова. Marina, ты стала программистом?)))
Serge Menko Уровень 58
29 августа 2024
стала программистом ?
Владислав Уровень 87
7 ноября 2024
Тем временем прошло 2 года и 6 месяцев, но мы так и не узнаем правды -_-
Денис Уровень 68
7 декабря 2024
можно в личку написать)
Konstantin Уровень 111 Expert
13 февраля 2022
слышал что плохая практика перехватывать при помощи Throwable... Или потом в catch методами у объекта ошибки вытаскиваем причину поломки и пишем в лог? Как на практике делается?
Батор Уровень 70 Expert
6 февраля 2022
ждем