Blocos Try aninhados em Java

Mar 04 2023
Em Java, uma instrução try pode estar dentro do bloco de outra tentativa. Ele é chamado de bloco try aninhado.

Em Java, uma instrução try pode estar dentro do bloco de outra tentativa. Ele é chamado de bloco try aninhado. Cada vez que uma instrução try é inserida, o contexto dessa exceção é colocado na pilha.

Por que usar o bloco try aninhado

Às vezes, pode surgir uma situação em que uma parte de um bloco pode causar um erro e o próprio bloco inteiro pode causar outro erro. Nesses casos, os manipuladores de exceção precisam ser aninhados.

Sintaxe

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);
    }
  }
}

Sem linha de comando: quando você executa o programa sem argumentos de linha de comando, uma exceção de divisão por zero é gerada pelo bloco try externo.

Um argumento de linha de comando: a execução do programa com um argumento de linha de comando gera uma exceção de divisão por zero de dentro do bloco try aninhado. Como o bloco interno não captura essa exceção, ela é passada para o bloco try externo, onde é tratada.

Dois argumentos de linha de comando : Se você executar o programa com dois argumentos de linha de comando, uma exceção de limite de matriz será gerada a partir do bloco try interno. Aqui estão as execuções de amostra que ilustram cada caso:

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

Às vezes, isso é inevitável, especialmente se o código de recuperação gerar uma exceção. Não é bonito, mas às vezes não há alternativas.

Notas laterais

  • Se uma instrução try interna não tiver uma instrução catch correspondente para uma exceção específica, o controle será transferido para os manipuladores catch da próxima instrução try esperados para uma instrução catch correspondente.
  • Isso continua até que uma das instruções catch seja bem-sucedida ou até que todas as instruções try aninhadas sejam concluídas.
  • Se nenhuma instrução catch corresponder, o sistema de tempo de execução Java manipulará a exceção. Cada vez que um bloco try não possui um manipulador catch para uma exceção específica, então os blocos catch do bloco try pai são inspecionados para essa exceção, se for encontrada correspondência que esse bloco catch é executado. Se nem o bloco catch nem o bloco catch pai manipulam a exceção então a mensagem gerada pelo sistema em tempo de execução seria mostrada para a exceção, semelhante ao que vemos quando não tratamos a exceção.
  • Quando blocos try aninhados são usados, o bloco try interno é executado primeiro. Qualquer exceção lançada no bloco try interno é capturada no bloco catch correspondente. Se um bloco catch correspondente não for encontrado, o bloco catch do bloco try externo será inspecionado até que todas as instruções try aninhadas sejam esgotadas. Se nenhum bloco correspondente for encontrado, o Java Runtime Environment tratará da execução.

// 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);
  }
}
}

Obrigado pela leitura.Bom aprendizado

Junte-se ao Grupo Mouad Oumous Java WhatsApp PARTICIPE

Junte-se ao canal de telegrama Mouad Oumous PARTICIPE

Apoie nossa publicação seguindo-a