"Jag skulle vilja berätta lite om hur undantag fungerar. Exemplet nedan borde ge dig en ungefärlig uppfattning om vad som händer:"

Kod som använder undantag:
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);

    }
}
Ungefärlig representation av vad som händer
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;
    }
}

"Jag är helt vilsen."

"Okej. Låt mig förklara vad som händer."

"I exemplet till vänster anropar vi några metoder i följd. I method2skapar vi medvetet och kastar ett undantag (vi skapar ett fel)."

"Exemplet till höger visar vad som händer."

"Titta på method2. Istället för att skapa ett undantag skapar vi ett RuntimeExceptionobjekt, sparar det i den statiska variabeln exceptionoch avslutar sedan omedelbart metoden med en returnsats."

"I method1, efter att ha anropat method2, kontrollerar vi om det finns ett undantag. Om det finns ett undantag, method1avslutas omedelbart. En sådan här kontroll utförs indirekt efter varje (!) metodanrop i Java."

"Wow!"

"Wow är rätt."

"I den högra kolumnen har jag använt huvudmetoden för att visa ungefär vad som händer när ett undantag fångas med en try-catch-konstruktion. Om det inte finns något undantag fortsätter allt att fungera som förväntat. Om det finns ett undantag och det är samma typ som anges i catch-satsen, då hanterar vi det."

"Vad menar throw och instanceof gör? "

"Titta på sista raden: throw new RuntimeException(s);. Så här skapar du och kastar ett undantag. Vi kommer inte att arbeta med det än. Det var bara ett exempel."

"Vi använder a instanceof Bför att kontrollera om objektet aär av typen B, dvs om objektet som variabeln undantag refererar till är ett RuntimeException. Detta är ett booleskt uttryck."

"Jag tror jag fattade det. Nästan."