– Chciałbym opowiedzieć Ci o tym, jak działają wyjątki. Poniższy przykład pokaże Ci dość ogólnie, jak to wygląda:

Kod, który używa wyjątków:

{


    public static void main(String[] args)
    {
        System.out.println("początek main");
        try
        {
            System.out.println("main przed wywołaniem");

            method1();



            System.out.println("main po wywołaniu");
        }
        catch (RuntimeException e)
        {


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

    public static void method1()
    {
        System.out.println("początek method1");
        method2();

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

    public static void method2()
    {
      System.out.println("method2");
      String s = "Komunikat: nieznany wyjątek";
      throw new RuntimeException(s);

    }
}
Przybliżona reprezentacja tego, co się dzieje
public class ExceptionPrzyklad
{
    private static Exception exception = null;

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

       
        System.out.println("main przed wywołaniem");

        method1();

        if (exception == null)
        {
            System.out.println("main po wywołaniu");
        }
        else if (exception instanceof RuntimeException)
        {
            RuntimeException e = (RuntimeException) exception;
            exception = null;
            String s = e.getMessage();
            System.out.println(s);
        }
        System.out.println("koniec main");
    }

    public static void method1()
    {
        System.out.println("początek method1");
        method2();
        if (exception != null) return;
        System.out.println("koniec method1");
    }

    public static void method2()
    {
        System.out.println("method2");
        String s = "Komunikat: nieznany wyjątek";
        exception = new RuntimeException(s);
        return;
    }
}

– Czuję się zagubiony.

– W porządku. Pozwól mi wytłumaczyć, o co w tym chodzi.

– W przykładzie po lewej stronie wywołujemy kolejno kilka metod. W method2 celowo tworzymy i wyrzucamy wyjątek (tworzymy błąd).

– Przykład po prawej stronie pokazuje, co tam się dzieje.

– Spójrz na method2. Zamiast tworzenia wyjątku tworzymy obiekt RuntimeException, zapisujemy go w zmiennej statycznej exception, a następnie natychmiast wychodzimy z metody, używając twierdzenia return.

– W method1 po wywołaniu method2 sprawdzamy, czy pojawia się wyjątek. Jeśli wyjątek się pojawia, method1 od razu kończy działanie. Tak samo, jak tutaj jest to sprawdzane pośrednio po każdym (!) wywołaniu metody w Javie.

– Wow!

– Wow to odpowiednie słowo.

– W prawej kolumnie użyłem metody main, aby pokazać ogólnie, co się dzieje, kiedy wyjątek jest obsługiwany przy użyciu konstruktu try-catch. Jeśli nie pojawia się wyjątek, wszystko działa tak, jak powinno. Natomiast jeśli wyjątek się pojawia i jest on tego samego typu, co w twierdzeniu catch, to go obsługujemy.

– Co znaczą throw i instanceof ?

– Spójrz na ostatnią linię: throw new RuntimeException(s);. Właśnie tak tworzysz i wyrzucasz wyjątek. Na razie nie będziemy się tym zajmować. To był tylko przykład.

– Używamy a instanceof B, aby sprawdzić, czy obiekt a jest typu B, tj. czy obiekt, do którego odnosi się zmienna exception to RuntimeException. To jest wyrażenie boolean.

– Chyba rozumiem. – Prawie.