Dlaczego sprawdzono kontra niesprawdzone wyjątki zwane „kontrowersją” w samouczku Oracle Java?

10

Jestem nowy w Javie i czytałem dokumentację dotyczącą wyjątków. , a zwłaszcza Niezaznaczone wyjątki - strona Kontrowersje .

Dolna linia mówi:

Jeśli można zasadnie oczekiwać, że klient wyzdrowieje z wyjątku, uczyń go sprawdzonym wyjątkiem. Jeśli klient nie może nic zrobić w celu odzyskania od wyjątku, uczyń z niego niesprawdzony wyjątek.

Nie rozumiem tego artykułu. Na czym polega „kontrowersja”? Czy możesz to wyjaśnić prostymi słowami?

ABcDexter
źródło
Proszę zobaczyć zaktualizowane pytanie, nie wydaje mi się, żeby to był duplikat :)
ABcDexter
3
„Próbowałem to przeczytać” - co się stało?
Bezużyteczne
2
Nazywa się to tak, ponieważ wokół tego tematu jest wiele kontrowersji. Zobacz także to pytanie StackOverflow: Sprawa przeciwko sprawdzonym wyjątkom, w której wspomniano o kilku cytatach znanych / wpływowych ludzi
Hulk

Odpowiedzi:

3

Najpierw dam wam przykład (ale na samym końcu znajduje się odpowiedź na pytanie, dlaczego kontrowersje).

Przypuśćmy, że edytujesz dokument w edytorze dokumentów opartym na Javie, a po zakończeniu wybierz Plik-> Zapisz jako ... i zdecydowałeś się zapisać dokument na wolumin, na którym nie masz uprawnień do zapisu. Edytor nie zawiesiłby się na tobie z brzydkim śledzeniem stosu, po prostu powiedziałby ci, że nie może zapisać pliku i pozwoli ci kontynuować edycję i / lub zapisać w innej lokalizacji.

W takim przypadku prawdopodobnie sprawdzono wyjątek, który został złapany i podjął działania, aby łaskawie go wyleczyć.

Z drugiej strony, załóżmy, że dzielenie przez zero lub zerowy wskaźnik wyjątku spowodowany błędem programowania, który powoduje, że jego brzydka głowa pojawia się tylko w określonych warunkach. Może się to zdarzyć w dowolnym miejscu w kodzie, pamięć RAM może zostać uszkodzona itp. Żaden dokument API nie powiedziałby, że „ta metoda spowodowałaby podział przez zero, jeśli pamięć RAM jest uszkodzona” .

Sprawdzone wyjątki powinny być częścią projektu, a użytkownicy tego interfejsu API powinni przygotować się na ich obsługę. Niesprawdzone wyjątki mogą zdarzyć się prawie wszędzie i są poza naszą kontrolą.

Kontrowersje powstają od programistów stosujących niesprawdzone wyjątki (od RuntimeException), kiedy powinni używać sprawdzonych wyjątków:

  • jako skrót, aby kompilator nie przeszkadzał
  • aby ich podpisy wyglądały na prostsze
  • ponieważ uważają, że sprawdzone wyjątki są kwestią zależności (jeśli rzucisz nowy sprawdzony wyjątek w klasie implementującej, powinieneś zmodyfikować podpis interfejsu) i viceversa.
Tulains Córdova
źródło
„powinieneś zmodyfikować podpis interfejsu” - cóż, jesteś nawet zmuszony do tego przez kompilator, a ty będziesz musiał go obsłużyć lub zadeklarować, aby został wyrzucony na każdej stronie połączenia.
Hulk,
3
To, czy aplikacja interfejsu użytkownika poprawnie obsługuje błąd w przyjazny dla użytkownika sposób, zależy od tego, jak dobrze programista napisał kod. Mogą w ten sposób napisać kod z niezaznaczonymi wyjątkami, tak jak ktoś inny może niepoprawnie obsłużyć błędy przy sprawdzonych wyjątkach. Intencją sprawdzonych wyjątków jest ułatwienie programistom prawidłowo obsługiwać błędy. Kontrowersje nie dotyczą tego, co tu twierdziłeś, ale raczej tego, czy faktycznie udało im się osiągnąć cel ułatwienia obsługi błędów. W opinii wielu nie; utrudniają.
Servy
@Servy W jaki przyjazny dla użytkownika sposób aplikacja UI może poradzić sobie z faktem, że procesor RAM nie działa lub nie ma cykli procesora z powodu awarii innego oprogramowania?
Tulains Córdova
1
@ TulainsCórdova W żadnym z tych przypadków program nawet nie uruchomi się , więc nie ma wyjątku dotyczącego obsługi okresu , więc próba przedstawienia błędu jest nieistotna, gdy nie jesteś w stanie uruchomić żadnego z twoich kod, kiedy to się stanie.
Servy
1
@ TulainsCórdova Nie musisz koniecznie napotkać błąd, aby go obsłużyć, ale tak, kompilator nie powie ci, że może zostać zgłoszony. Kontrowersje dotyczą tego, czy kompilator informujący, że wyjątek może zostać zgłoszony, jest w rzeczywistości pomocny. Niektórzy myślą, że tak, inni myślą, że nie. Pytanie brzmi: jaka jest kontrowersja i to jest odpowiedź. Twoje stwierdzenie o tym, co stanowi główną kontrowersję sprawdzonych wyjątków, nie jest prawdą.
Servy,
-4

Na tej stronie nie ma kontrowersji. To Oracle mówi ludziom, aby korzystali ze sprawdzonych wyjątków.

Wymyśleni przez nich fałszywe „kontrowersje” dotyczą projektantów i użytkowników języka. Projektanci pozwolili ludziom rzucać i łapać rzeczy, które (ich zdaniem) nie powinny być rzucane ani łapane. Stworzyli więc stronę internetową narzekającą na leniwych programistów.

ascotan
źródło
4
Jest to spór, nawet jeśli strona niewiele mówi o tym. Kwestią kontrowersyjną jest odpowiedź na pytanie: „Czy sprawdzone wyjątki pomagają, czy utrudniają rozwój lepszego oprogramowania?” I „Jeśli tak, jakie wyjątki należy sprawdzić, a które nie zaznaczyć?” Założę się, że możesz rozpocząć ożywioną dyskusję, jeśli zgromadzisz wystarczającą liczbę programistów (i piwo) w pokoju, aby odpowiedzieć na te pytania.
Solomon Slow