"Jag skulle vilja berätta lite om hur undantag fungerar. Exemplet nedan borde ge dig en ungefärlig uppfattning om vad som händer:"
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;
}
}
"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 method2
skapar 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 RuntimeException
objekt, sparar det i den statiska variabeln exception
och avslutar sedan omedelbart metoden med en return
sats."
"I method1
, efter att ha anropat method2
, kontrollerar vi om det finns ett undantag. Om det finns ett undantag, method1
avslutas 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 B
fö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."
GO TO FULL VERSION