Как работает Exception под капотом? Что заставляет его обрабатывать?

Что заставляет обрабатывать Exception? Что не заставляет обрабатывать RuntimeException? Про разницу проверяемых и непроверяемых я знаю, но не понимаю их отличие именно под капотом.


Ответы (2 шт):

Автор решения: Wlad

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

   public void myCustomFunc() throws Exception {

    }
    
    
    public void main(){
        try {
            myCustomFunc();
        } catch (Exception exception) {
            exception.printStackTrace();
        }
    }
→ Ссылка
Автор решения: Roman-Stop RU aggression in UA

Все отличие касательно обязательности или необязательности реализовано в компиляторе и происходит на этапе компиляции. В runtime никаких отличий в возбуждении/обработке исключений нет.

В комплияторе реализована такая логика:

  • если исключение не наследуется от RuntimeException, то либо функция, которая его бросает должна вызываться в блоке try и исключении должно быть обработано в блоке catch или исключение должно быть объявлено в сигнатуре функции, внутри которой может быть брошено исключение. Если ни то не другое не сделано, то компилятор выдает ошибку компиляции.
  • если же исключение наследуется от RuntimeException, то эта проверка не делается.
→ Ссылка