"Szeretnék egy kicsit mesélni a kivételek működéséről. Az alábbi példa hozzávetőleges képet ad arról, hogy mi történik:"

Kivételeket használó kód:
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);

    }
}
Hozzávetőleges ábrázolása annak, ami történik
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;
    }
}

– Teljesen elvesztem.

"Rendben. Hadd magyarázzam el, mi történik."

"A bal oldali példában néhány metódust hívunk meg egymás után. A -ban method2szándékosan hozunk létre és dobunk kivételt (hibát hozunk létre)."

"A jobb oldali példa mutatja, mi történik."

"Nézd meg method2. Kivétel létrehozása helyett létrehozunk egy RuntimeExceptionobjektumot, elmentjük a statikus változóba exception, majd egy utasítással azonnal kilépünk a metódusból return."

"A -ban method1a hívás után method2megnézzük, hogy van-e kivétel. Ha van kivétel, akkor method1azonnal véget ér. Egy ilyen ellenőrzés közvetve minden (!) Java metódushívás után megtörténik."

"Azta!"

– Hú, igaza van.

"A jobb oldali oszlopban a fő módszert használtam, hogy hozzávetőlegesen megmutassam, mi történik, ha egy kivételt elkapnak egy try-catch konstrukcióval. Ha nincs kivétel, akkor minden a várt módon fut tovább. Ha van kivétel, és az a catch utasításban megadott típus, akkor kezeljük."

– Mit jelent throw és mit instanceof jelent?

"Nézd meg az utolsó sort: throw new RuntimeException(s);. Így hozol létre és dobsz kivételt. Ezen még nem dolgozunk. Ez csak egy példa volt."

"Azt használjuk a instanceof B, hogy ellenőrizzük, hogy az objektum atípusú- Be, azaz a változókivétel által hivatkozott objektum RuntimeException-e. Ez egy logikai kifejezés."

– Azt hiszem, megkaptam. Majdnem.