Этот вопрос нацелен на то, как JVM может гарантировать выполнение блока finally (если JVM не сбой и поток не прерывается или не выходит).
Подпрашиваемый вопросом интервью, я пытаюсь понять, как JVM может обеспечить, чтобы блок finally был выполнен даже в странных обстоятельствах... Рассмотрим следующий код:
try{
int[] someArray = new int[10];
int invalid = someArray[10];
}
catch(IndexOutOfBoundsException e){
throw new RuntimeException("Other Exception");
}
finally{
//close open files or HTTP connections etc.
}
Хотя это может быть странным обстоятельством, блок finally по-прежнему гарантированно выполняется, несмотря на то, что Other Exception не рассматривается явно. Как JVM обрабатывает такие ситуации?
Мои мысли:
Из того, что я понимаю и прочитал до сих пор, когда встречается необработанное исключение, управление передается из текущего потока (к этому потоку ThreadGroup
, я думаю). Может ли быть какое-то условие в ThreadGroup
, которое проверяет окончательные блоки, которые должны выполняться? Единственное, о чем я могу думать, это, пожалуй, адрес блока finally где-то. Затем JVM делает goto, когда исключение обнаруживается и возвращается к исключению, когда блок finally завершил выполнение.
Может ли кто-нибудь объяснить, как этот процесс на самом деле происходит?