"Jeg vil gjerne fortelle deg litt om hvordan unntak fungerer. Eksempelet nedenfor bør gi deg en grov ide om hva som skjer:"
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 fortapt."
"OK. La meg forklare hva som skjer."
"I eksempelet til venstre kaller vi noen få metoder etter hverandre. I method2
, oppretter og kaster vi bevisst et unntak (vi lager en feil)."
"Eksemplet til høyre viser hva som skjer."
"Se på method2
. I stedet for å lage et unntak, lager vi et RuntimeException
objekt, lagrer det i den statiske variabelen exception
og avslutter deretter metoden umiddelbart ved å bruke en return
setning."
"I method1
, etter å ha kalt method2
, sjekker vi om det er et unntak. Hvis det er et unntak, method1
avsluttes det med en gang. En slik sjekk utføres indirekte etter hvert (!) metodekall i Java."
"Wow!"
"Wow er rett."
"I den høyre kolonnen har jeg brukt hovedmetoden for å vise omtrent hva som skjer når et unntak fanges opp ved hjelp av en try-catch-konstruksjon. Hvis det ikke er noe unntak, fortsetter alt å kjøre som forventet. Hvis det er et unntak og det er den samme typen som er spesifisert i catch-erklæringen, så håndterer vi den."
"Hva gjør throw
og instanceof
mener? "
"Se på den siste linjen: throw new RuntimeException(s);
. Dette er hvordan du oppretter og kaster et unntak. Vi vil ikke jobbe med det ennå. Det var bare et eksempel."
"Vi bruker a instanceof B
for å sjekke om objektet a
er av typen B
, dvs. om objektet det refereres til av variabelunntaket er et RuntimeException. Dette er et boolsk uttrykk."
"Jeg tror jeg har fått det. Nesten."
GO TO FULL VERSION