throws Exception
Deklaracja jest zautomatyzowany sposób śledzenie metod, które mogłyby rzucić wyjątek dla przewidywanych ale nieuniknionych powodów. Deklaracja jest zwykle specyficzna dla typu lub typów wyjątków, które mogą być generowane, takich jak throws IOException
lub throws IOException, MyException
.
Wszyscy mamy lub w końcu napiszemy kod, który nieoczekiwanie zatrzymuje się i zgłasza wyjątek z powodu czegoś, czego nie przewidzieliśmy przed uruchomieniem programu, na przykład dzielenie przez zero lub indeksowanie poza zakresem. Ponieważ metoda nie spodziewała się błędów, nie można ich było „wychwycić” i obsłużyć za pomocą klauzuli try catch. Niczego nie podejrzewający użytkownicy metody również nie wiedzieliby o takiej możliwości, a ich programy również by się zatrzymały.
Gdy programista wie, że mogą wystąpić pewne typy błędów, ale chciałby obsłużyć te wyjątki poza metodą, metoda może „zgłosić” jeden lub więcej typów wyjątków do metody wywołującej zamiast ich obsługi. Gdyby programista nie zadeklarował, że metoda (mogłaby) rzucić wyjątek (lub gdyby Java nie miała możliwości zadeklarowania go), kompilator nie mógł tego wiedzieć i przyszły użytkownik metody miałby wiedzieć o tym, złapać i obsłużyć wszelkie wyjątki, które metoda może zgłosić. Ponieważ programy mogą mieć wiele warstw metod napisanych przez wiele różnych programów, śledzenie, które metody mogą generować wyjątki, staje się trudne (niemożliwe).
Mimo że Java ma możliwość deklarowania wyjątków, nadal możesz napisać nową metodę z nieobsługiwanymi i niezadeklarowanymi wyjątkami, a Java ją skompiluje i możesz ją uruchomić i mieć nadzieję na najlepsze. To, czego Java nie pozwoli ci zrobić, to skompilowanie nowej metody, jeśli używa metody, która została zadeklarowana jako wyjątek (y) wyrzucania, chyba że obsłużysz zadeklarowane wyjątki w swojej metodzie lub zadeklarujesz swoją metodę jako rzucającą to samo wyjątek (y) lub jeśli istnieje wiele wyjątków, możesz obsłużyć niektóre i wyrzucić resztę.
Gdy programista deklaruje, że metoda rzuca określony typ wyjątku, jest to po prostu zautomatyzowany sposób ostrzeżenia innych programistów za pomocą metody, że wyjątek jest możliwy. Programista może następnie zdecydować o obsłużeniu wyjątku lub przekazaniu ostrzeżenia, deklarując metodę wywołującą, która również zgłasza ten sam wyjątek. Ponieważ kompilator został ostrzeżony, że wyjątek jest możliwy w tej nowej metodzie, może automatycznie sprawdzić, czy przyszłe obiekty wywołujące nową metodę obsługują wyjątek lub deklarują go i wymuszają wystąpienie jednego lub drugiego.
Zaletą tego typu rozwiązania jest to, że gdy kompilator zgłasza Error: Unhandled exception type java.io.IOException
, podaje plik i numer wiersza metody, która została zadeklarowana do zgłaszania wyjątku. Następnie możesz zdecydować się po prostu przekroczyć cenę i zadeklarować, że twoja metoda również „rzuca IOException”. Można to zrobić aż do metody głównej, w której spowodowałoby to zatrzymanie programu i zgłoszenie wyjątku użytkownikowi. Jednak lepiej jest wyłapać wyjątek i poradzić sobie z nim w przyjemny sposób, na przykład wyjaśnić użytkownikowi, co się stało i jak to naprawić. Gdy metoda przechwytuje i obsługuje wyjątek, nie musi już deklarować wyjątku. Na tym kończą się, że tak powiem.