"Vorrei parlarvi un po' di come funzionano le eccezioni . L'esempio seguente dovrebbe darvi un'idea approssimativa di cosa succede:"

Codice che utilizza le eccezioni:
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);

    }
}
Rappresentazione approssimativa di ciò che accade
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;
    }
}

"Sono totalmente perso."

"Va bene. Lascia che ti spieghi cosa sta succedendo."

"Nell'esempio a sinistra, chiamiamo alcuni metodi in successione. In method2, creiamo deliberatamente e lanciamo un'eccezione (creiamo un errore)."

"L'esempio a destra mostra cosa sta succedendo."

"Guarda method2. Invece di creare un'eccezione, creiamo un RuntimeExceptionoggetto, lo salviamo nella variabile statica exceptione poi usciamo immediatamente dal metodo usando un'istruzione return."

"In method1, dopo aver chiamato method2, controlliamo se c'è un'eccezione. Se c'è un'eccezione, method1termina immediatamente. Un controllo come questo viene eseguito indirettamente dopo ogni (!) Chiamata al metodo in Java."

"Oh!"

"Wow è giusto."

"Nella colonna di destra, ho usato il metodo main per mostrare approssimativamente cosa succede quando viene rilevata un'eccezione usando un costrutto try-catch. Se non c'è un'eccezione, allora tutto continua a funzionare come previsto. Se c'è un'eccezione e è lo stesso tipo specificato nell'istruzione catch, quindi lo gestiamo."

"Cosa significa throw e instanceof significa? "

"Guarda l'ultima riga: throw new RuntimeException(s);. Questo è il modo in cui crei e lanci un'eccezione. Non ci lavoreremo ancora. Era solo un esempio."

"Usiamo a instanceof Bper verificare se object aè di tipo B, cioè se l'oggetto a cui fa riferimento la variabile exception è una RuntimeException. Questa è un'espressione booleana."

"Credo di aver capito. Quasi."