"Gostaria de falar um pouco sobre como as exceções funcionam. O exemplo abaixo deve dar uma ideia aproximada do que acontece:"

Código que usa exceções:
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);

    }
}
Representação aproximada do que acontece
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;
    }
}

"Estou totalmente perdido."

"Tudo bem. Deixe-me explicar o que está acontecendo."

"No exemplo à esquerda, chamamos alguns métodos em sucessão. Em method2, criamos e lançamos uma exceção deliberadamente (criamos um erro)."

"O exemplo à direita mostra o que está acontecendo."

"Veja method2. Em vez de criar uma exceção, criamos um RuntimeExceptionobjeto, salvamos na variável estática exceptione imediatamente saímos do método usando uma returninstrução."

"Em method1, depois de chamar method2, verificamos se há uma exceção. Se houver uma exceção, então method1termina de uma vez. Uma verificação como essa é realizada indiretamente após cada (!) chamada de método em Java."

"Uau!"

"Uau está certo."

"Na coluna da direita, usei o método main para mostrar aproximadamente o que acontece quando uma exceção é capturada usando uma construção try-catch. Se não houver exceção, tudo continuará funcionando conforme o esperado. Se houver uma exceção e ela é o mesmo tipo especificado na instrução catch, então nós o tratamos."

"O que significa throw e instanceof significa? "

"Veja a última linha: throw new RuntimeException(s);. É assim que você cria e lança uma exceção. Não vamos trabalhar nisso ainda. Foi apenas um exemplo."

"Usamos a instanceof Bpara verificar se o objeto aé do tipo B, ou seja, se o objeto referenciado pela variável exceção é uma RuntimeException. Esta é uma expressão booleana."

"Acho que consegui. Quase."