„Бих искал да ви разкажа малко за това How работят изключенията . Примерът по-долу трябва да ви даде груба представа Howво се случва:“

Код, който използва изключения:
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);

    }
}
Приблизително представяне на случващото се
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;
    }
}

— Съвсем съм се загубил.

— Добре. Нека ти обясня Howво става.

„В примера отляво извикваме последователно няколко метода. В method2, съзнателно създаваме и хвърляме изключение (създаваме грешка).“

„Примерът вдясно показва Howво се случва.

„Вижте method2. Вместо да създаваме изключение, ние създаваме обект RuntimeException, запазваме го в статичната променлива exceptionи след това незабавно излизаме от метода с помощта на returnоператор.“

method1, след извикване method2, ние проверяваме дали има изключение. Ако има изключение, то method1приключва веднага. Проверка като тази се извършва индиректно след всяко (!) извикване на метод в Java."

"Еха!"

"Уау е прав."

"В дясната колона използвах основния метод, за да покажа приблизително Howво се случва, когато изключение бъде уловено с помощта на конструкция try-catch. Ако няма изключение, тогава всичко продължава да работи според очакванията. Ако има изключение и то е от същия тип, посочен в оператора catch, тогава ние го обработваме."

"Какво правя throw и instanceof означавам? "

„Вижте последния ред: throw new RuntimeException(s);. Ето How създавате и хвърляте изключение. Все още няма да работим върху това. Това беше просто пример.“

„Използваме a instanceof B, за да проверим дали обектът aе от тип B, т.е. дали обектът, посочен от променливата изключение, е RuntimeException. Това е булев израз.“

— Мисля, че го разбрах. Почти.