Czy przyszła Wam do głowy jedna okoliczność związana ze słowem kluczowym "throws" omawianym tutaj? Obsługa wyjątków kryje jeszcze jedną tajemnicę. Jak wspomniałem, "throws" "przerzuca" odpowiedzialność obsłużenia zgłoszonego wyjątku metodzie wywołującej. A co w przypadku gdy "main" posiada taką definicję? Jakie konsekwencje mogą z tego wyniknąć? Czytajcie dalej, a okaże się to ciekawsze od powieści kryminalnej.
Tweet |
OBSŁUGA WYJĄTKÓW PRZEZ FUNKCJĘ "MAIN"
Gdy poznałem zastosowanie słowa kluczowego "throws", też nie myślałem o tym w taki sposób jaki efekt może to przynieść jeżeli podstawimy to do funkcji od której się wszystko zaczyna, do funkcji "main". Któregoś dnia pozwoliłem sobie zrobić eksperyment. I jak myślicie, co się stało w przypadku wystąpienia wyjątku, przerzucenia go do "main", a funkcja "main" też postanowiła przerzucić ten wyjątek nie wiadomo w czyją stronę?
Wyskoczył komunikat?
Wyjątek został zignorowany?
Wybuchł komputer?
Hmmm...choć rzeczywiście zostawienie tego w takiej postaci jest błędem kardynalnym, to Java ochroni nas przed jakimikolwiek konsekwencjami. Sprawdźmy to sami prowokując wyjątek zgodnie z powyżej opisaną sytuacją.
KOD ŹRÓDŁOWY I SPROWOKOWANIE WYJĄTKU
Obsługa wyjątków lubi zaskakiwać nieoczekiwanymi skutkami naszych działań. Skopiujcie sobie program! Chyba najkrótszy ze wszystkich na temat Javy:
- KLASA "Main"
public class Main
{
public static void main(String[] args) throws ArithmeticException
{
new IllegalOperation();
}
}
- KLASA "IllegalOperation"
public class IllegalOperation
{
public IllegalOperation() throws ArithmeticException
{
int x = 12 / 0;
}
}
Nawet z takiej rzeczy możemy wyciągnąć cenny wniosek. Zauważyliście, że konstruktory również mogą mieć klauzulę "throws"? Obsługa wyjątków pozwala na to jak najbardziej. W każdym razie, uruchomcie i zobaczcie co się stanie. Funkcja "main" nie mając komu przerzucić zgłoszonego wyjątku po prostu...zakończy program! Tak samo "brutalnie" jak w języku C byśmy dopuścili się naruszenia ochrony pamięci. Pstryk i aplikacji nie ma!
W konsoli to może być niezauważalne, aczkolwiek jakbyście programowali graficzny interfejs użytkownika, spróbujcie wtedy to wywołać, a okno zamknie się Wam automatycznie "bez słowa wyjaśnienia". To akurat jedynie tytułem ciekawostki. Może to nie jest nic ekscytującego, aczkolwiek warto wiedzieć co się dzieje w sytuacji postawienia funkcji "main" w niekorzystnej sytuacji. Obsługa wyjątków nie może wtedy zostać przeprowadzona.
To było jedynie pokazanie Wam skutków ubocznych. Zaprezentowane działania są jak najbardziej karygodne i nie świadczą o Waszym profesjonalizmie. Nie próbujcie tego robić w domu!