programowanieProgramista Java Backend

Co to są wyjątki (exceptions) w Javie? Wyjaśnij różnicę między checked a unchecked exceptions i kiedy używać której kategorii.

Zdaj rozmowy kwalifikacyjne z asystentem AI Hintsage

Odpowiedź

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:

  • Checked exceptions (dziedziczące po Exception, z wyjątkiem RuntimeException): muszą być jawnie obsługiwane lub zadeklarowane w sygnaturze metody przez throws.
  • Unchecked exceptions (dziedziczące po RuntimeException): nie wymagają jawnej obsługi, mogą wystąpić w dowolnym miejscu (na przykład NullPointerException).

Kiedy używać?

  • Checked — dla oczekiwanych błędów, które można obsłużyć (na przykład, błędy związane z plikami, błędy sieciowe).
  • Unchecked — dla błędów świadczących o defektach programowych (na przykład, niewłaściwy indeks tablicy).
Przykład kodu
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 }

Pytanie podchwytliwe

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 }

Przykłady rzeczywistych błędów z powodu nieznajomości niuansów tematu


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.