"Jeg vil gerne fortælle dig lidt om, hvordan undtagelser fungerer. Eksemplet nedenfor burde give dig en nogenlunde idé om, hvad der sker:"
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;
}
}
"Jeg er helt lost."
"Okay. Lad mig forklare, hvad der foregår."
"I eksemplet til venstre kalder vi nogle få metoder efter hinanden. I method2
, opretter og kaster vi bevidst en undtagelse (vi opretter en fejl)."
"Eksemplet til højre viser, hvad der sker."
"Se på method2
. I stedet for at oprette en undtagelse opretter vi et RuntimeException
objekt, gemmer det i den statiske variabel exception
og afslutter derefter metoden med det samme ved hjælp af en return
sætning."
"I method1
, efter opkald method2
kontrollerer vi, om der er en undtagelse. Hvis der er en undtagelse, method1
afsluttes med det samme. En kontrol som denne udføres indirekte efter hvert (!) metodekald i Java."
"Wow!"
"Wow er rigtigt."
"I højre kolonne har jeg brugt hovedmetoden til at vise omtrent, hvad der sker, når en undtagelse fanges ved hjælp af en try-catch-konstruktion. Hvis der ikke er nogen undtagelse, fortsætter alt med at køre som forventet. Hvis der er en undtagelse, og det er den samme type angivet i catch-opgørelsen, så håndterer vi det."
"Hvad gør throw
og instanceof
mener? "
"Se på den sidste linje: throw new RuntimeException(s);
. Sådan opretter og kaster du en undtagelse. Det vil vi ikke arbejde på endnu. Det var bare et eksempel."
"Vi bruger a instanceof B
til at kontrollere, om objektet a
er af typen B
, dvs. om objektet, der refereres til af variablen undtagelse, er en RuntimeException. Dette er et boolesk udtryk."
"Jeg tror, jeg fik det. Næsten."
GO TO FULL VERSION