Error

Открыта

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, 02:05
тушите свет
Max
Уровень 93
8 декабря 2024, 18:24
Ох, не жданчик 😀 Быстренько пробежимся по теме, всего-то на полтора часика ⌚
Олег
Уровень 106
Expert
5 июня 2024, 10:14
Ну очень тяжело, честно говоря.
Денис
Уровень 68
7 декабря 2024, 05:22
Но это того стоило, глядя с уровня 106 ).
jvatechsBackend Developer в Ищу стажировкуExpert
12 декабря 2022, 04:20
/* Комментарий удален */
Алексей
Уровень 24
Expert
15 декабря 2022, 09:05
мне кажется год не пишет в комментарии. Стал программистом?
jvatechsBackend Developer в Ищу стажировкуExpert
15 декабря 2022, 20:10
пишет, пишет) хотелось бы конечно стать программистом за 4 дня, но увы и ах:)
Dmitrijs Papakuls
Уровень 92
Expert
18 июня 2023, 13:43
стал программистом ?
СтаниславРаботает в NeomaticExpert
18 июня 2023, 13:59
Стал программистом? =)
5 июля 2023, 10:32
Бытует легенда, что он ушел в эскорт, так как это проще
Serge Menko Java Developer
29 августа 2024, 16:09
стал программистом ?
Александр Ф
Уровень 1
18 февраля 2025, 15:24
Стал программистом? :)
Marina Rossa
Уровень 88
12 мая 2022, 20:55
Спросите у меня через полгода, стала ли я программистом
2 июня 2022, 10:56
В Августе уже джуном должна стать
Владимир
Уровень 108
10 августа 2022, 17:45
ну шо? 5 месяцев есть
Дарья
Уровень 109
22 августа 2022, 20:41
ждём ноября! =)
jvatechsBackend Developer в Ищу стажировкуExpert
12 декабря 2022, 04:19
Марина, стала ли ты программистом?
Николай
Уровень 70
Expert
12 декабря 2022, 13:24
уже 9 месяцев прошло, ну как там дела обстоят?
Руслан
Уровень 115
7 декабря 2023, 08:23
Прошло много времени и ответа не получили поэтому спрошу снова. Marina, ты стала программистом?)))
Serge Menko Java Developer
29 августа 2024, 16:09
стала программистом ?
Владислав
Уровень 90
7 ноября 2024, 09:38
Тем временем прошло 2 года и 6 месяцев, но мы так и не узнаем правды -_-
Денис
Уровень 68
7 декабря 2024, 05:24
можно в личку написать)
Konstantin Backend Developer Expert
13 февраля 2022, 12:25
слышал что плохая практика перехватывать при помощи Throwable... Или потом в catch методами у объекта ошибки вытаскиваем причину поломки и пишем в лог? Как на практике делается?
Батор
Уровень 70
Expert
6 февраля 2022, 18:09
ждем