Вложенные блоки Try в Java

Mar 04 2023
В Java инструкция try может находиться внутри блока другой попытки. Он называется вложенным блоком try.

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

Зачем использовать вложенный блок try

Иногда может возникнуть ситуация, когда часть блока может вызвать одну ошибку, а сам блок целиком может вызвать другую ошибку. В таких случаях обработчики исключений должны быть вложенными.

Синтаксис

try {
   statement 1;
   statement 2;
   try {
      statement 1;
      statement 2;
   }
   catch(Exception e) {
      // catch the corresponding exception  
   }  
}
catch(Exception e) {
   // catch the corresponding exception
}
   .............

// An example of nested try statements.
class NestTry {
public static void main(String args[]) {
    try {
        int a = args.length;
        /* If no command-line args are present,
        the following statement will generate
        a divide-by-zero exception. */
        int b = 42 / a;
        System.out.println("a = " + a);
        try { // nested try block
            /* If one command-line arg is used,
            then a divide-by-zero exception
            will be generated by the following code. */
            if(a==1) a = a/(a-a); // division by zero
            /* If two command-line args are used,
            then generate an out-of-bounds exception. */
            if(a==2) {
                int c[] = { 1 };
                c[42] = 99; // generate an out-of-bounds exception
            }
        } catch(ArrayIndexOutOfBoundsException e) {
        System.out.println("Array index out-of-bounds: " + e);
        }
    } catch(ArithmeticException e) {
    System.out.println("Divide by 0: " + e);
    }
  }
}

Нет командной строки: когда вы выполняете программу без аргументов командной строки, внешний блок try генерирует исключение деления на ноль.

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

Два аргумента командной строки : если вы выполняете программу с двумя аргументами командной строки, во внутреннем блоке try генерируется исключение границы массива. Вот примеры прогонов, иллюстрирующие каждый случай:

C:\>java NestTry
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One
a = 1
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One Two
a = 2
Array index out-of-bounds:
java.lang.ArrayIndexOutOfBoundsException:42

Иногда это неизбежно, особенно если ваш код восстановления может вызвать исключение. Некрасиво, но иногда альтернатив нет.

Дополнительные примечания

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

// An example of nested try statements.
class NestTry {
public static void main(String args[]) {
try {
  int a = args.length;
  /* If no command-line args are present,
  the following statement will generate
  a divide-by-zero exception. */
  int b = 42 / a;
  System.out.println("a = " + a);
  try { // nested try block
    /* If one command-line arg is used,
    then a divide-by-zero exception
    will be generated by the following code. */
    if(a==1) a = a/(a-a); // division by zero
    /* If two command-line args are used,
    then generate an out-of-bounds exception. */
    if(a==2) {
      int c[] = { 1 };
      c[42] = 99; // generate an out-of-bounds exception
  }
  } catch(ArrayIndexOutOfBoundsException e) {
  System.out.println("Array index out-of-bounds: " + e);
}
} catch(ArithmeticException e) {
System.out.println("Divide by 0: " + e);
}
}
}

C:\>java NestTry
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One
a = 1
Divide by 0: java.lang.ArithmeticException: / by zero
C:\>java NestTry One Two
a = 2
Array index out-of-bounds:
java.lang.ArrayIndexOutOfBoundsException:42

/* Try statements can be implicitly nested via
calls to methods. */
class MethNestTry {
static void nesttry(int a) {
  try { // nested try block
    /* If one command-line arg is used,
    then a divide-by-zero exception
    will be generated by the following code. */
    if(a==1) a = a/(a-a); // division by zero
    /* If two command-line args are used,
    then generate an out-of-bounds exception. */
    if(a==2) {
      int c[] = { 1 };
      c[42] = 99; // generate an out-of-bounds exception
  }
  } catch(ArrayIndexOutOfBoundsException e) {
      System.out.println("Array index out-of-bounds: " + e);
  }
}
public static void main(String args[]) {
  try {
    int a = args.length;
    /* If no command-line args are present,
    the following statement will generate
    a divide-by-zero exception. */
    int b = 42 / a;
    System.out.println("a = " + a);
    nesttry(a);
  } catch(ArithmeticException e) {
    System.out.println("Divide by 0: " + e);
  }
}
}

Спасибо за чтение. Приятного обучения

Присоединяйтесь к группе Mouad Oumous Java в WhatsApp

Присоединяйтесь к каналу Telegram Mouad Oumous ПРИСОЕДИНЯЙТЕСЬ

Поддержите нашу публикацию, подписавшись на нее