Propagowanie wyjątków

Wyjątki mogą być rzucane jawnie – tj. przez programistę – z użyciem słówka kluczowego throw. Mogą być rzucane także przez Wirtualną Maszynę Javy. Niezależnie jednak od tego jaki jest typ wyjątku i jego źródło jest on propagowany – przerywając wykonanie się programu – tak długo, jak długo nie jest przechwycony i obsłużony. Jeśli dany wyjątek nie jest nigdzie obsługiwany, to jego wystąpienie spowoduje przerwanie działania całego programu. Aby się o tym przekonać uruchommy poniższy kod, nie przekazując do programu żadnych parametrów wywołania:

public class TestClass {
  public static void main(String[] args) {
    System.out.println("Kod przed wyjątkiem");
  
     if (args.length == 0)
       throw new RuntimeException("Brak parametrów");

    System.out.println("Kod za wyjątkiem");
  }
}

Uruchomienie programu bez parametrów wywołania (wtedy warunek args.length == 0 jest spełniony) spowoduje wyświetlenie na konsoli tekstu:

Kod przed wyjątkiem
Exception in thread "main" java.lang.RuntimeException: Brak parametrów
  at TestClass.main(TestClass.java:6)

Jak widzimy w pierwszej kolejności wykonywane są instrukcje wypisujące tekst „Kod przed wyjątkiem”, po czym rzucany jest wyjątek i tekst „Kod za wyjątkiem” nie jest już wyświetlany. Rzucony wyjątek nie został przechwycony i obsłużony, zatem program zakończył się. Opis wyjątku, tj. jego typ (java.lang.RuntimeException), komunikat (Brak parametrów) i miejsce wystąpienia (metoda main(…) w klasie TestClass, 6. linia kodu w pliku TestClass.java) zostały wyświetlone na konsoli.

Zmodyfikujmy teraz powyższy przykład co nieco, tak abyśmy mogli szczegółowo prześledzić sposób propagowania się wyjątków:

public class TestClass {
  public static void main(String[] args) {
    System.out.println("Przed wywołaniem");

    someOp(args);
 
    System.out.println("Za wywołaniem");
  }

  static void someOp(String[] args) {
    if (args.length == 0)
      throw new RuntimeException("Brak parametrów");

    System.out.println("Za wyjątkiem w metodzie");
  }
}

Co do zasady działania jest to program bardzo podobny do poprzedniego, z tą tylko różnicą że część kodu jest przeniesiona do osobnej metody. To właśnie w tej metodzie rzucamy wyjątek. Prześledźmy krok po kroku, jak ten wyjątek wpłynie na działanie naszego programu.

W pierwszej kolejności wyświetlany jest napis „Przed wywołaniem”, następnie uruchamiana jest metoda someOp(…). W metodzie tej rzucany jest wyjątek typu java.lang.RuntimeException. Wyjątek ten powoduje, że przerwane jest wykonanie metody someOp(…) i wracamy do miejsca w kodzie, w którym ta metoda została wywołana, a więc do metody main(…). Wywołanie metody someOp(…) w metodzie main(…) zakończyło się wyjątkiem i program zachowuje się dalej dokładnie tak jakbyśmy w miejsce wywołania metody someOp(…) wstawili instrukcję throw rzucającą wyjątek. Wykonanie metody main(…) jest zatem przerywane w tym miejscu i metoda main(…) kończy się przerzucając dalej ten wyjątek. Ponieważ metoda main(…) jest pierwszą wywołaną metodą, to nie ma już komu tego wyjątku przekazać do obsługi, zatem cały program kończy się rzucając ten wyjątek. Efekt jest podobny do tego jaki uzyskaliśmy uruchamiając poprzedni przykład.

0 0 votes
Daj ocenę