Deklarowanie wyjątków

W artykule „Propagowanie wyjątków” zaimplementowaliśmy sobie metodę someOp(…) która rzucała wyjątek typu java.lang.RuntimeException. Wyjątki typu RuntimeException to tak zwane wyjątki niekontrolowane, a więc takie których nie musimy deklarować lub obsługiwać. W niniejszym artykule dowiemy się, co by było gdybyśmy chcieli zamiast wyjątku RuntimeException rzucać jakiś wyjątek kontrolowany, np. wyjątek typu java.lang.Exception.

Zerknijmy jeszcze raz na metodę someOp(…), w wersji takiej jaką znamy ze wspomnianego artykułu, a więc rzucającą wyjątek typu RuntimeException:

static void someOp(String[] args) {
  if (args.length == 0)
    throw new RuntimeException("Brak parametrów");
  
  System.out.println("Za wyjątkiem w metodzie");
}

Aby móc zmienić typ wyjątku na wyjątek klasy Exception musimy dodać do deklaracji metody someOp(…) deklarację, że metoda ta rzuca wyjątek tego typu. Ogólna składnia takiej deklaracji jest następująca:

{deklaracja metody z listą argumentów} throws {lista wyjątków} {
  {ciało metody}
}

Element {deklaracja metody z listą argumentów} to deklaracja jaką znamy. Po tej deklaracji umieszczamy słówko kluczowe throws i po nim listę typów wyjątków potencjalnie rzucanych przez tą metodę. Kolejne typy wyjątków wymieniamy rozdzielając je przecinkami. Metoda someOp(…) rzucająca wyjątek klasy Exception wyglądałaby więc następująco:

static void someOp(String[] args) throws Exception {
  if (args.length == 0)
    throw new Exception("Brak parametrów");
  
  System.out.println("Za wyjątkiem w metodzie");
}

Co ważne, deklaracja wyjątków rzucanych przez metodę wcale nie oznacza że metoda ta zawsze zakończy się rzucając taki czy inny wyjątek. Jest to tylko informacja, że metoda ta może zakończyć się – w pewnych okolicznościach których znać nie musimy – jednym z wymienionych wyjątków.

Deklarując wyjątki rzucane przez metodę musimy podawać nazwę klasy poprzedzoną nazwą pakietu albo samą nazwę klasy jeśli klasę tę uprzednio zaimportowaliśmy. W powyższym przykładzie podaliśmy samą nazwę klasy, gdyż klasy z pakietu java.lang są importowane automatycznie. Więcej o importowaniu klas napisałem w artykule „Importowanie klas”.