"Szeretnék egy kicsit mesélni a kivételek működéséről. Az alábbi példa hozzávetőleges képet ad arról, hogy mi történik:"
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;
}
}
– Teljesen elvesztem.
"Rendben. Hadd magyarázzam el, mi történik."
"A bal oldali példában néhány metódust hívunk meg egymás után. A -ban method2szándékosan hozunk létre és dobunk kivételt (hibát hozunk létre)."
"A jobb oldali példa mutatja, mi történik."
"Nézd meg method2. Kivétel létrehozása helyett létrehozunk egy RuntimeExceptionobjektumot, elmentjük a statikus változóba exception, majd egy utasítással azonnal kilépünk a metódusból return."
"A -ban method1a hívás után method2megnézzük, hogy van-e kivétel. Ha van kivétel, akkor method1azonnal véget ér. Egy ilyen ellenőrzés közvetve minden (!) Java metódushívás után megtörténik."
"Azta!"
– Hú, igaza van.
"A jobb oldali oszlopban a fő módszert használtam, hogy hozzávetőlegesen megmutassam, mi történik, ha egy kivételt elkapnak egy try-catch konstrukcióval. Ha nincs kivétel, akkor minden a várt módon fut tovább. Ha van kivétel, és az a catch utasításban megadott típus, akkor kezeljük."
– Mit jelent throw és mit instanceof jelent?
"Nézd meg az utolsó sort: throw new RuntimeException(s);. Így hozol létre és dobsz kivételt. Ezen még nem dolgozunk. Ez csak egy példa volt."
"Azt használjuk a instanceof B, hogy ellenőrizzük, hogy az objektum atípusú- Be, azaz a változókivétel által hivatkozott objektum RuntimeException-e. Ez egy logikai kifejezés."
– Azt hiszem, megkaptam. Majdnem.
GO TO FULL VERSION