Throws - wyjąki

Odpowiedz Nowy wątek
2019-02-16 20:59
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

Pozostało 580 znaków

2019-02-16 21:10
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ć.

edytowany 1x, ostatnio: Afish, 2019-02-16 21:25
Pokaż pozostałe 7 komentarzy
Za mainem jest cała masa JVM, która zajmie się tym wyjątkiem. - Afish 2019-02-16 21:23
Zajmie się wyjątkiem w jaki sposób? Z postu i komentarzy niżej wynika, ze jak go nie obsłużę to program się wywali, bo go oddelegowałem poza main. - must 2019-02-16 21:43
Wypisze na standardowe wyjście i posprząta po programie. - Afish 2019-02-16 22:02
A jak bym nie dał throws to nie zrobi tego samego (pomińmy to, ze muszę w jakiś sposób obsłużyć wyjątek) ? - must 2019-02-16 22:04
Jak nie dasz throws, to musisz sam złapać wyjątek, bo inaczej kompilator tego nie przepuści, więc wtedy żaden wyjątek nie ucieknie z maina. - Afish 2019-02-16 22:07

Pozostało 580 znaków

2019-02-16 21:17

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.

Pokaż pozostałe 3 komentarze
Nie rozumiem jakim wyjątkiem. Druga część się zgadza. - szweszwe 2019-02-16 21:23
Regułą jest to, że: wszystkie checked trzeba obsłużyć natomiast throws jest tak jakby wyjątkiem (nie w javovym sensie), który pozwala nam nie obsługiwać rzuconego wyjątku typu checked. - must 2019-02-16 21:25
Hm. Throws mówi, że ta metoda rzuca wyjątek. Wywołując tę metodę (powiedzmy a) w innej metodzie (powiedzmy b) musisz ten wyjątek obsłużyć albo powiedzieć, że metoda b też rzuca wyjątek. I tak dalej aż do metody main. Ale możesz ją po drodze gdzieś obsłużyć. - szweszwe 2019-02-16 21:27
No tak tak, ale nie o to chodziło :P Po prostu mi chodziło o samodzielne obsłużenie, a nie delegowanie obsługi do maszyny. - must 2019-02-16 21:28
No to teoretycznie nie musisz na żadnym etapie pisać try... catch. Możesz to zostawić i stanie się to co pisał @Afish - szweszwe 2019-02-16 21:29

Pozostało 580 znaków

2019-02-16 21:26
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?

edytowany 1x, ostatnio: must, 2019-02-16 21:27

Pozostało 580 znaków

2019-02-16 21:28
1

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

Pokaż pozostałe 4 komentarze
No właśnie wyżej, a poza mainem go nie ma więc go nie obsłużę mimo, że "muszę" i program się wywali więc bezsensownym jest dawanie w takim wypadku throws. Tutaj nie obsłużyłem teog wyjątku nigdzie, a throws musiałem wszędzie dodawać, co się mija z celem. I bez throws sie wywali i z throws jak go nie obsluze tez sie wywali. - must 2019-02-16 21:55
No nie mija się z celem bo jak robisz throws z main to pewnie ze świadomością, że tego nie obsługujesz. Zawsze to jest jakaś informacja dla Ciebie. - szweszwe 2019-02-16 21:57
Czyli suma sumarum, powinno się obsługiwać. Jak daje w main throws to nie obsługuje wyjątku i tyle :D Czyli jest to wyjątek od reguły, bo kompilator wtedy nie krzyczy, że nie obsłużyłem wyjątku typu checked. - must 2019-02-16 22:00
No mniej więcej jakoś tak. Raczej nigdzie nie spotkasz main z throws. Chyba, że na I roku gimnazjum - szweszwe 2019-02-16 22:01
Dzięki za rozjaśnienie tematu. - must 2019-02-16 22:08

Pozostało 580 znaków

2019-02-16 22:06
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.

Dzięki za rozjaśnienie tematu. - must 2019-02-16 22:08

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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