logo search
Хабибуллин

Порядок обработки исключений

Блоки catch(){} перехватывают исключения в порядке написания этих блоков. Данное правило приводит к интересным результатам.

В листинге 21.2 мы записали два блока перехвата catch(){}, и оба блока выполнялись при возникновении соответствующего исключения. Это происходило потому, что клас-

сы-исключения ArithmeticException и ArrayIndexOutOfBoundsException находятся на раз-

ных ветвях иерархии исключений. Иначе обстоит дело, если блоки catch(){} перехватывают исключения, расположенные на одной ветви. Если в листинге 21.5 после блока, перехватывающего RuntimeException, поместить блок, обрабатывающий выход индекса за пределы:

try{

//Операторы, вызывающие исключения

}catch(RuntimeException re){

//Какая-то обработка

}catch(ArrayIndexOutOfBoundsException ae){

//Никогда не будет выполнен!

}

то он не будет выполняться, поскольку исключение этого типа является к тому же исключением общего типа RuntimeException и будет перехватываться предыдущим блоком catch(){}. Впрочем, компилятор сообщит вам о том, что исключение типа

ArrayOutOfBoundsException уже перехватывается блоком, обрабатывающим RuntimeException.