Вот что Википедия говорит о предложении finally:
Более распространенным является связанный пункт
(наконец, или убедитесь), что выполняется
произошло ли исключение или нет,
как правило, чтобы освободить ресурсы
приобретенный в теле
блок обработки исключений.
Давайте рассмотрим вашу программу.
try {
System.out.print(1);
q();
}
Итак, на экран выводится 1
, затем вызывается q()
. В q()
выдается исключение. Затем исключение перехватывается Exception y
, но оно ничего не делает. Затем выполняется условие finally (оно должно быть выполнено), поэтому на экране будет выведено 3
. Поскольку (в методе q()
есть исключение, которое выдается в предложении finally , метод q()
также передает исключение в родительский стек (throws Exception
в объявлении метода) new Exception()
будет Брошенное и перехваченное исключение catch ( Exception i )
, MyExc2
будет выброшено (сейчас добавьте его в стек исключений), но сначала будет выполнено finally в блоке main
.
Итак,
catch ( Exception i ) {
throw( new MyExc2() );
}
finally {
System.out.print(2);
throw( new MyExc1() );
}
A наконец, предложение называется ... (помните, мы только что поймали Exception i
и выбросили MyExc2
) по сути, 2
выводится на экран ... и после 2
выводится на экран, выдается исключение MyExc1
. MyExc1
обрабатывается методом public static void main(...)
.
Выход:
"132Exception в главной теме потока MyExc1"
Лектор правильный! : -)
По сути , если у вас есть finally в предложении try / catch, будет выполняться finally ( после , перехватив исключение перед выбрасывает пойманное исключение)