"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 method2
szá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 RuntimeException
objektumot, elmentjük a statikus változóba exception
, majd egy utasítással azonnal kilépünk a metódusból return
."
"A -ban method1
a hívás után method2
megnézzük, hogy van-e kivétel. Ha van kivétel, akkor method1
azonnal 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 a
típusú- B
e, azaz a változókivétel által hivatkozott objektum RuntimeException-e. Ez egy logikai kifejezés."
– Azt hiszem, megkaptam. Majdnem.
GO TO FULL VERSION