– Chciałbym opowiedzieć Ci o tym, jak działają wyjątki. Poniższy przykład pokaże Ci dość ogólnie, jak to wygląda:
{
public static void main(String[] args)
{
System.out.println("początek main");
try
{
System.out.println("main przed wywołaniem");
method1();
System.out.println("main po wywołaniu");
}
catch (RuntimeException e)
{
String s = e.getMessage();
System.out.println(s);
}
System.out.println("koniec main");
}
public static void method1()
{
System.out.println("początek method1");
method2();
System.out.println("koniec method1");
}
public static void method2()
{
System.out.println("method2");
String s = "Komunikat: nieznany wyjątek";
throw new RuntimeException(s);
}
}
public class ExceptionPrzyklad
{
private static Exception exception = null;
public static void main(String[] args)
{
System.out.println("początek main");
System.out.println("main przed wywołaniem");
method1();
if (exception == null)
{
System.out.println("main po wywołaniu");
}
else if (exception instanceof RuntimeException)
{
RuntimeException e = (RuntimeException) exception;
exception = null;
String s = e.getMessage();
System.out.println(s);
}
System.out.println("koniec main");
}
public static void method1()
{
System.out.println("początek method1");
method2();
if (exception != null) return;
System.out.println("koniec method1");
}
public static void method2()
{
System.out.println("method2");
String s = "Komunikat: nieznany wyjątek";
exception = new RuntimeException(s);
return;
}
}
– Czuję się zagubiony.
– W porządku. Pozwól mi wytłumaczyć, o co w tym chodzi.
– W przykładzie po lewej stronie wywołujemy kolejno kilka metod. W method2
celowo tworzymy i wyrzucamy wyjątek (tworzymy błąd).
– Przykład po prawej stronie pokazuje, co tam się dzieje.
– Spójrz na method2
. Zamiast tworzenia wyjątku tworzymy obiekt RuntimeException
, zapisujemy go w zmiennej statycznej exception
, a następnie natychmiast wychodzimy z metody, używając twierdzenia return
.
– W method1
po wywołaniu method2
sprawdzamy, czy pojawia się wyjątek. Jeśli wyjątek się pojawia, method1
od razu kończy działanie. Tak samo, jak tutaj jest to sprawdzane pośrednio po każdym (!) wywołaniu metody w Javie.
– Wow!
– Wow to odpowiednie słowo.
– W prawej kolumnie użyłem metody main, aby pokazać ogólnie, co się dzieje, kiedy wyjątek jest obsługiwany przy użyciu konstruktu try-catch. Jeśli nie pojawia się wyjątek, wszystko działa tak, jak powinno. Natomiast jeśli wyjątek się pojawia i jest on tego samego typu, co w twierdzeniu catch, to go obsługujemy.
– Co znaczą throw
i instanceof
?
– Spójrz na ostatnią linię: throw new RuntimeException(s);
. Właśnie tak tworzysz i wyrzucasz wyjątek. Na razie nie będziemy się tym zajmować. To był tylko przykład.
– Używamy a instanceof B
, aby sprawdzić, czy obiekt a
jest typu B
, tj. czy obiekt, do którego odnosi się zmienna exception to RuntimeException. To jest wyrażenie boolean.
– Chyba rozumiem. – Prawie.
GO TO FULL VERSION