"Me gustaría contarles un poco sobre cómo funcionan las excepciones . El siguiente ejemplo debería darle una idea aproximada de lo que sucede:"

Código que usa excepciones:
class ExceptionExampleOriginal
{


    public static void main(String[] args)
    {
        System.out.println("main begin");
        try
        {
            System.out.println("main before call");

            method1();



            System.out.println("main after call");
        }
        catch (RuntimeException e)
        {


            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main end");
    }

    public static void method1()
    {
        System.out.println("method1 begin");
        method2();

        System.out.println("method1 end");
    }

    public static void method2()
    {
      System.out.println("method2");
      String s = "Message: Unknown Exception";
      throw new RuntimeException(s);

    }
}
Representación aproximada de lo que sucede.
public class ExceptionExample
{
    private static Exception exception = null;

   public static void main(String[] args)
    {
        System.out.println("main begin");

       
        System.out.println("main before call");

        method1();

        if (exception == null)
        {
            System.out.println("main after call");
        }
        else if (exception instanceof RuntimeException)
        {
            RuntimeException e = (RuntimeException) exception;
            exception = null;
            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("main end");
    }

    public static void method1()
    {
        System.out.println("method1 begin");
        method2();
        if (exception != null) return;
        System.out.println("method1 end");
    }

    public static void method2()
    {
        System.out.println("method2");
        String s = "Message: Unknown Exception";
        exception = new RuntimeException(s);
        return;
    }
}

"Estoy totalmente perdido".

"Está bien. Déjame explicarte lo que está pasando".

"En el ejemplo de la izquierda, llamamos a varios métodos en sucesión. En method2, deliberadamente creamos y lanzamos una excepción (creamos un error)".

"El ejemplo de la derecha muestra lo que está sucediendo".

"Mire method2. En lugar de crear una excepción, creamos un RuntimeExceptionobjeto, lo guardamos en la variable estática exceptiony luego salimos inmediatamente del método usando una returndeclaración".

"En method1, después de llamar method2, verificamos si hay una excepción. Si hay una excepción, method1finaliza de inmediato. Una verificación como esta se realiza indirectamente después de cada (!) llamada de método en Java".

"¡Guau!"

"Wow es correcto".

"En la columna de la derecha, he usado el método principal para mostrar aproximadamente lo que sucede cuando se detecta una excepción usando una construcción try-catch. Si no hay una excepción, entonces todo continúa funcionando como se esperaba. Si hay una excepción y es del mismo tipo especificado en la instrucción catch, entonces lo manejamos".

"¿Qué significan throw y instanceof ? "

"Mira la última línea: throw new RuntimeException(s);. Así es como creas y lanzas una excepción. Todavía no trabajaremos en eso. Fue solo un ejemplo".

"Utilizamos a instanceof Bpara comprobar si el objeto aes de tipo B, es decir , si el objeto al que hace referencia la excepción variable es una RuntimeException. Esta es una expresión booleana".

"Creo que lo tengo. Casi".