Исключения

Исключения #

1. Расскажите про иерархию исключений #

Exceptions

Class Throwable - общий предок для всех исключений


2. Что такое Error и Exception? #

Exception - это исключения выполнения программы Error - ошибки JVM, программисту не стоит обрабатывать их через try-catch


3. Расскажите про обрабатываемые и необрабатываемые исключения #

Проверяемые (checked) исключения обязаны быть явно обработаны до компиляции (Exception и некоторые наследники) Непроверяемые (unchecked) не требуют явной обработки (Error, RuntimeException)


4. О чем говорит ключевое слово throws? #

Ключевое слово throws говорит о том, что метод может выбросить исключение указанных типов. Передаёт обработку исключения вышестоящему методу.


5. Как создать собственное («пользовательское») исключение? #

Наследоваться от RuntimeException (рекомендуется, но можно и от Exception), переопределить методы при необходимости


6. Расскажите про механизм обработки исключений в java (Try-catch-finally) #

Блок try - блок, содержащий код, который может выбросить исключение при выполнении Блок catch - блок, “ловящий” выброшенные в try исключения при соответствии его типа с ожидаемым Блок finally - блок, выполняющийся после блоков try и catch вне зависимости от того, было ли выброшено исключение. Например, чтобы освободить какой-то ресурс


7. Возможно ли использование блока try-finally (без catch)? #

Да, в таком случае после try выполнится finally


8. Может ли один блок catch отлавливать сразу несколько исключений? #

Да


9. Всегда ли выполняется блок finally? Существуют ли ситуации, когда блок finally не будет выполнен? #

Да, кроме случаев завершения программы или JVM. finally может не выполниться, если в блоке try вызывается System.exit(0)


10. В каком порядке следует обрабатывать исключения в catch блоках? #

От наследника к родителю (от более специфичных к общему). В противоположном случае до наследников невозможно добраться, т.к. родительское исключение будет перехватывать всё


11. Что такое механизм try-with-resources? #

Это механизм, который автоматические закрывает ресурс, объявленный в круглых скобках try(). В качестве ресурса можно использовать любой объект, класс которого реализует интерфейс AutoClosable или Closable (Scanner, например)


12. Ошибка OutOfMemoryError. Поймать утечку памяти и пофиксить #

Ошибка OutOfMemoryError возникает, когда JVM не может выделить достаточно памяти для выполнения программы. Это может быть связано с утечками памяти, неправильной конфигурацией или большим объемом данных. Вот пошаговый процесс, как выявить и устранить причину:

  1. Сделать дамп памяти
  2. Проанализировать дамп, найти причины утечек. Типичные источники:
    • неосвобождённые ресурсы
    • переполненные коллекции
    • статические ссылки (в т.ч. статические коллекции)
    • неотписавшиеся слушатели
  3. Устранить причины


13. @SneakyThrows в Lombok #

@SneakyThrows — это аннотация Lombok, которая позволяет автоматически обрабатывать исключения, не требуя явного указания try-catch или объявления throws в методе. Lombok оборачивает вызов в блок, который выбрасывает исключение как RuntimeException

@SneakyThrows
public void riskyMethod() {
    throw new IOException("Exception example"); // Не нужно объявлять throws IOException
}


14. StackOverflowError vs OutOfMemoryError #

StackOverflowError - выбрасывается при переполнении стека (в стеке не хватает памяти). Обычно возникает при рекурсиях. Можно решить через -Xss параметр JVM, но как правило, проблема именно в рекурсии, её и нужно решить.

OutOfMemoryError - выбрасывается когда JVM не может выделить достаточно памяти в куче для создания нового объекта. Возможные причины:

  • создание очень большого массива или объекта
  • утечки памяти (неочищенные ссылки на объекты)
  • чрезмерное создание объектов без их удаления
  • чрезмерное ограничение памяти кучи через JVM параметр -Xmx (по умолчанию 256 МБ) Варианты решения:
  • использовать профилировщики памяти для анализа (VisualVMMAT)
  • удалять ненужные объекты (list.clear()null-ссылки)
  • увеличить ограничение памяти JVM (-Xmx1024m)
  • оптимизировать управление памятью (использовать WeakReferenceSoftReference)