Перейти к контенту

Вложенный блок try catch в Java

Когда блок try catch присутствует в другом блоке try, он называется вложенным блоком try catch. Каждый раз, когда в блоке try отсутствует обработчик catch для определенного исключения, тогда catch родительского try проверяются на наличие этого исключения, если обнаружено совпадение, тогда этот catch выполняется.

Если даже родительский catch не обрабатывает исключение, то для него будет показано сгенерированное системой сообщение.

 

Давайте сначала посмотрим на синтаксис, а затем обсудим это на примере.

Синтаксис

....
//Main try block
try {
   statement 1;
   statement 2;
   //try-catch block inside another try block
   try {
      statement 3;
      statement 4;
      //try-catch block inside nested try block
      try {
         statement 5;
         statement 6;
      }
      catch(Exception e2) {
         //Exception Message
      }
   }
   catch(Exception e1) {
       //Exception Message
   }
   
}
//Catch of Main(parent) try block
catch(Exception e3) {
      //Exception Message
}
....

Пример

Здесь мы имеем глубокое (двухуровневое) вложение, что означает, что у нас есть блок try-catch внутри вложенного блока try. Чтобы вы лучше поняли, мы дали имена каждому блоку try в комментариях, такие как try-block2, try-block3 и т. д.

Вот как выглядит структура: try-block3 находится внутри try-block2, а try-block2 находится внутри основного try. Можно сказать, что основной try является прародителем try-block3. Обратитесь к объяснению, которое дано в конце этого кода.

class NestingDemo{
   public static void main(String args[]){
      //main try-block
      try{
    	//try-block2
        try{     
            //try-block3
            try{
            	int arr[]= {1,2,3,4};
            	/* I'm trying to display the value of
            	 * an element which doesn't exist. The
            	 * code should throw an exception
            	 */
            	System.out.println(arr[10]);
            }catch(ArithmeticException e){
            	System.out.print("Arithmetic Exception");
            	System.out.println(" handled in try-block3");
            }
        }
        catch(ArithmeticException e){
           System.out.print("Arithmetic Exception");
           System.out.println(" handled in try-block2");
        }
    }
    catch(ArithmeticException e3){
    	System.out.print("Arithmetic Exception");
     	System.out.println(" handled in main try-block");
    }
    catch(ArrayIndexOutOfBoundsException e4){
    	System.out.print("ArrayIndexOutOfBoundsException");
     	System.out.println(" handled in main try-block");
    }
    catch(Exception e5){
    	System.out.print("Exception");
     	System.out.println(" handled in main try-block");
     }
  }
}

Вывод:

ArrayIndexOutOfBoundsException handled in main try-block

Как вы можете видеть, исключение ArrayIndexOutOfBoundsException произошло в большом дочернем элементе try-block3. Так как он не обрабатывает это исключение, управление передается родительскому try-block2 и ищет обработчики перехвата в нем. Поскольку try-block2 также не обрабатывает это исключение, элемент управления передается в основной (родительский) блок, где он нашел соответствующий блок catch для исключения. Вот как работает структура вложенности.

Пример 2

class Nest{
   public static void main(String args[]){
	 //Parent try block
     try{
    	//Child try block1
         try{
            System.out.println("Inside block1");
            int b =45/0;
            System.out.println(b);
         }
         catch(ArithmeticException e1){
            System.out.println("Exception: e1");
         }
         //Child try block2
         try{
            System.out.println("Inside block2");
            int b =45/0;
            System.out.println(b);
         }
         catch(ArrayIndexOutOfBoundsException e2){
            System.out.println("Exception: e2");
         }
        System.out.println("Just other statement");
    }
    catch(ArithmeticException e3){
    	 System.out.println("Arithmetic Exception");
         System.out.println("Inside parent try catch block");
    }
    catch(ArrayIndexOutOfBoundsException e4){
    	System.out.println("ArrayIndexOutOfBoundsException");
         System.out.println("Inside parent try catch block");
    }
    catch(Exception e5){
    	System.out.println("Exception");
         System.out.println("Inside parent try catch block");
    }
    System.out.println("Next statement..");
  }
}

Выход:

Inside block1
Exception: e1
Inside block2
Arithmetic Exception
Inside parent try catch block
Next statement..

Это еще один пример, который показывает, как работает вложенный блок try. Вы можете видеть, что есть два блока try-catch внутри тела основного try. Мы пометили их как блок 1 и блок 2 в приведенном выше примере.

  • Block1: мы разделили целое число на ноль, и это вызвало ArithmeticException, поскольку block1 обрабатывает ArithmeticException, отображается «Exception: e1».
  • Block2: В блоке 2 возникла ArithmeticException, но catch здесь обрабатывает только ArrayIndexOutOfBoundsException, поэтому в этом случае элемент управления переходит к основному телу try-catch (parent) и проверяет обработчик захвата ArithmeticException в родительских catch. Так как перехват родительского блока try обрабатывает это исключение с помощью универсального обработчика исключений, в качестве вывода отображается сообщение «Внутри родительского блока try catch».
  • Попытка родительского контроля Catch: здесь не возникло никаких исключений, поэтому на экране появилось сообщение «Next Statement ..»

Здесь важно отметить, что всякий раз, когда дочерние блоки catch не обрабатывают никаких исключений, идет переход к родительским блокам catch. Если исключение также не обрабатывается, то программа внезапно завершает работу, показывая сгенерированное системой сообщение.

Оцени статью

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим - напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Помогите улучшить статью.

 

Пока нет комментариев.

Добавить комментарий

Ваш e-mail не будет опубликован.

СайдбарКомментарии (0)