Cómo funciona la captura múltiple - 1

"Algunas lecciones más interesantes. ¡Oh, cómo me encanta enseñar!"

"Me gustaría contarles cómo funcionan varios bloques catch . Es muy simple: cuando ocurren excepciones en un bloque try , la ejecución se mueve al primer bloque catch ".

"Si un tipo indicado entre paréntesis del bloque catch coincide con el tipo de la excepción lanzada, entonces la ejecución comienza dentro de ese bloque. De lo contrario, pasamos al siguiente bloque catch , donde se realiza la misma verificación".

"Si nos quedamos sin bloques catch y la excepción no ha sido capturada, se volverá a generar y el método actual terminará de manera anormal".

"Ya veo. El bloque catch que coincida con el tipo de excepción será el que se ejecute".

"Sí, claro. Sin embargo, en realidad es un poco más complicado. Las clases pueden heredar otras clases. Si una clase Vaca hereda una clase Animal, el objeto Vaca puede ser referenciado no solo por una variable Vaca, sino también por una variable Animal. "

"¿Y?"

"Debido a que todas las excepciones heredan Exception o RuntimeException (que también hereda Exception ), aún pueden capturarse usando 'catch ( Exception e)' o ' catch (RuntimeException e) '".

"¿Y?"

"Podemos sacar dos conclusiones. Primero, puede usar 'catch (Exception e)' para capturar cualquier excepción. Segundo, el orden de los bloques catch es importante " .

"Aquí hay unos ejemplos:"

"Lo ArithmeticExceptionque ocurra después de dividir por 0 se capturará en el segundo bloque catch".

Código
try
{
    System.out.println("Before calling method1.");
    int a = 1 / 0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
    System.out.println("Division by zero. Exception has been caught.");
}
catch (Exception e)
{
    System.out.println("Any other errors. Exception has been caught.");
}

"En el ejemplo a continuación, se ArithmeticExceptioncapturará en el primer bloque catch, porque todas las excepciones heredan Exception, es decir, Exceptioncubre todas las excepciones " .

Código
try
{
    System.out.println("Before calling method1.");
    int a = 1/0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (Exception e)
{
    System.out.println("Any other errors. Exception has been caught.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
    System.out.println("Divided by zero. Exception has been caught.");
}

"En el siguiente ejemplo, ArithmeticExceptionno se detectará. Se volverá a lanzar al método de llamada".

Código
try
{
    System.out.println("Before calling method1.");
    int a = 1/0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}

"Eso aclaró un poco las cosas. Estas excepciones no son el tema más fácil".

"Solo lo parece. En realidad, son una de las cosas más simples en Java".

"No sé si estar feliz o triste por eso..."