Wyjątki (exceptions) to mechanizm obsługi błędów w Javie. Każdy wyrzucany obiekt jest klasą pochodną od Throwable. Istnieją dwie główne kategorie:
Exception, z wyjątkiem RuntimeException): muszą być jawnie obsługiwane lub zadeklarowane w sygnaturze metody przez throws.RuntimeException): nie wymagają jawnej obsługi, mogą wystąpić w dowolnym miejscu (na przykład NullPointerException).Kiedy używać?
public void readFile(String path) throws IOException { // Checked exception — wymagana obsługa Files.readAllLines(Paths.get(path)); } public void divide(int a, int b) { int c = a / b; // Unchecked — ArithmeticException }
Czy metoda, która nie deklaruje throws, może wyrzucić checked exception?
Odpowiedź: Nie, kompilator nie pozwoli wyrzucić checked exception bez deklaracji w sygnaturze metody (throws). Ale unchecked exception może być wyrzucona bez żadnego ostrzeżenia.
void foo() { throw new IOException(); // Błąd kompilacji }
Historia
W banku internetowym klient postanowił zignorować obsługę
SQLExceptions, używając unchecked-owinnych opakowań. Z tego powodu, podczas aktualizacji sterownika, niewidoczne błędy prowadziły do niespójności danych.
Historia
W aplikacji logującej plik loga pozostał zablokowany z powodu nieuchwytnego checked exception (
FileNotFoundException), który "zgubiono" w łańcuchu wywołań, błąd nie został obsłużony na czas, a aplikacja nie mogła już nic pisać do logów.
Historia
W platformie handlowej zespół wdrożył globalny catch(Throwable), aby "nigdy nie padać". W efekcie krytyczne unchecked-exceptions były maskowane — aplikacja kontynuowała działanie w niespójnym stanie, co prowadziło do trudnych błędów i utraty danych.