Throws - wyjąki

0

Cześć. Mam pytanie odnośnie wyjątków, a dokładniej o słówko throws.
Ad1 .Wyczytałem na internecie, że powinno się tylko "rzucać" w sygnaturze metody tylko wyjątki typu checked (wiadomo) i musimy je obsłużyć w którejś metodzie, która wywołuję metodę z throws, to prawda? Kładę nacisk tutaj na musimy.
Wczytam cytat z jakiejś stronki: Throws keyword can be placed in the method declaration. It denotes which exceptions can be thrown from this method. We must handle these exceptions with try-catch.

Ad2. Wg tego co jest u góry muszę tutaj obsłużyć wyjątek SQLException, który jest typu checked, czyli kompilator powinien wołać o jego obsłużenie, natomiast tego nie robi o program działa poprawnie.
SQLException zaczyna się w repo, później przechodzi do "silnika", następnie do maina. Wszędzie są dodane końcówki throws SQLException, ale w żadnej metodzie tego nie obsługuje. O co tutaj chodzi, dlaczego to działa? Gist: https://gist.github.com/must1/57d5986d5cd58237871d479038e0f1d9

1

Jeżeli chcesz z metody wypuścić wyjątek, to musisz o tym poinformować przez throws. Jeżeli tego nie zrobisz, to nie możesz pozwolić, aby wyjątek z metody wyszedł, a z tego wynika, że jeżeli wywołujesz jakąś metodę rzucającą wyjątek i go nie obsłużysz, to kompilator krzyknie.

We must handle these exceptions with try-catch. — to jest niepoprawne, zawsze możemy stwierdzić, że pozwalamy wyjątkowi wyskoczyć i nic nie musimy obsługiwać.

1

Jeżeli będziesz chciał tę metodę wywołać w innej metodzie która nie bedzie oznaczona jako throws to nie musisz tam obsługiwać tego wyjątku. W twoim przypadku dochodzisz aż do metody main której nie wywołasz sam z siebie więc nie obsłużysz tego. Jeżeli poleci tam wyjątek to się obsłuży domyślnie - czyli coś ci tam wypisze na konsole a program się wywali.

0

Jeszcze jedno pytanie. Mam rozumieć, ze jest to złą praktyką programistyczną nie obsługiwać takiego wyjątku i przepuszczać go dalej, aby się nie zająć nim samodzielnie?

1

No raczej tak.. Zawsze lepiej w przypadku nie otwarcia pliku o tym poinformować niż wywalić program :]

2

Czyli jest to wyjątek od reguły, bo kompilator wtedy nie krzyczy, że nie obsłużyłem wyjątku typu checked

To nie jest żaden wyjątek od reguły. Nie chcesz obsługiwać wyjątku, to nie ma problemu, coś zrobi to za Ciebie. W aplikacji konsolowej to będzie JVM wypisujący wyjątek na konsolę, w jakimś frameworku webowym będzie to zwrócenie kodu 500 do klienta, na wątku działającym w tle będzie to ubicie wątku. Nie jesteś pępkiem świata, to, że nie obsłużyłeś wyjątku nie oznacza, że nagle świat się wali, to nie jest dobra praktyka, ale jednocześnie to nie jest sytuacja rzadka jak zaćmienie słońca.

1 użytkowników online, w tym zalogowanych: 0, gości: 1