„Aș dori să vă spun puțin despre cum funcționează excepțiile . Exemplul de mai jos ar trebui să vă ofere o idee aproximativă despre ceea ce se întâmplă:”

Cod care folosește excepții:
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);

    }
}
Reprezentare aproximativă a ceea ce se întâmplă
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;
    }
}

„Sunt complet pierdut”.

— Bine. Lasă-mă să explic ce se întâmplă.

„În exemplul din stânga, numim câteva metode succesive. În method2, creăm și aruncăm în mod deliberat o excepție (creăm o eroare).”

„Exemplul din dreapta arată ce se întâmplă”.

„Uită-te la method2. În loc să creăm o excepție, creăm un RuntimeExceptionobiect, îl salvăm în variabila statică exceptionși apoi ieșim imediat din metodă folosind o returninstrucțiune.”

„În method1, după apelarea method2, verificăm dacă există o excepție. Dacă există o excepție, atunci method1se termină imediat. O verificare ca aceasta este efectuată indirect după fiecare apel de metodă (!) în Java.”

"Wow!"

"Wow este corect."

„În coloana din dreapta, am folosit metoda principală pentru a arăta aproximativ ce se întâmplă atunci când o excepție este capturată folosind un construct try-catch. Dacă nu există nicio excepție, atunci totul continuă să ruleze așa cum era de așteptat. Dacă există o excepție și este același tip specificat în instrucțiunea catch, apoi ne ocupăm de el."

„Ce înseamnă throw și ce instanceof înseamnă?

"Uită-te la ultima linie: throw new RuntimeException(s);. Așa creezi și arunci o excepție. Nu vom lucra încă la asta. A fost doar un exemplu."

„Folosim a instanceof Bpentru a verifica dacă obiectul aeste de tipul B, adică dacă obiectul la care face referire excepția variabilei este o excepție RuntimeException. Aceasta este o expresie booleană.”

— Cred că am înțeles. Aproape.