Как работает 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, то эта проверка не делается.