Po co metoda rzuca wyjątkiem

0

Witam,

Mam taki kod

    void close() throws IOException
    {
        if (mySock!=null)
        {
            mySock.close();
            mySock = null;
        }
    }

I właściwie po co w deklaracji jest IOException, gdzie jest różnica jeśli wewnatrz funkcji close znalazł by się blok try catch. I jak takie metody się wywołuje. A jeszcze dalej - co jeśli będzie wyjątek np nie mozna zamknąc gniazdka albo gniazdko jest już zamknięte lub coś w tym stylu?

Z javy to umię tylko to co mi potrzebne - a więc na razie trochę komunikacja sieciowa a dla innych to pewnie wydaje sie banalne pytanie - nie dla mnie.

Pozdrawiam.

0

dzieki temu ten kto wywoluje metode close może obsłużyc wyjatek na swoj sposób (wyswietlic komunikat, zamknac plik czy cokolwiek).

0

Wyjątki, które nie dziedziczą po RuntimeException muszą być łapane - takie sobie zabezpieczenie.
Jeśli nie chcesz łapać wyjątku w tej metodzie, bo nie jest Ci tutaj potrzebna jego obsługa i wydaje się być ona ważniejsze dla kogoś, kto Twojej metody użyje(np Ciebie, ale w innym miejscu), możesz zadeklarować, że metoda rzuca wyjątek - wtedy ktoś inny będzie musiał ją łapać (lub zrobić to samo co Ty)

0
agnieszka napisał(a)

I właściwie po co w deklaracji jest IOException, gdzie jest różnica jeśli wewnatrz funkcji close znalazł by się blok try catch.

Mozna utworzyć metodę close() zwracającą boolean informujący o powodzeniu lub nie. Chodzi jednak o spójność koncepcji w której stan wyjątkowy ma być stanem wyjątkowym, a nie normalnym wynikiem jakiejś metody. W przypadku procedury bez zwracanego wyniku nie ma problemu, ale jeżeli metoda zwraca konkretny wynik, to wyrzucenie wyjątku jest jedynym sensownym sposobem poinformowania, że coś poszło źle i wyniki metody w ogóle nie mogą powstać lub będą bez sensu. Alternatywą jest oczywiście zwrócenie wartości null dla metod zwracających referencję do obiektu. Ale w takim wypadku w mnóstwie miejsc w programie pojawiłoby się testowanie wartości null na dowolnej referencji, a to poza zaciemnianiem kodu jest nadmiarowość ponieważ java w swoim zakresie w wielu przypadkach niejawnie testuje wartość zerową referencji.

agnieszka napisał(a)

I jak takie metody się wywołuje. A jeszcze dalej - co jeśli będzie wyjątek np nie mozna zamknąc gniazdka albo gniazdko jest już zamknięte lub coś w tym stylu?

W celu upewnienia się, że mimo wystąpienia wyjątku jakiś kod na pewno się wykona jest umieszczenie go w klauzulii "finally". Pełna postać instrukcji try jest taka: try {} catch(Exception e) {} finally {}. Przy czym musi nastąpić conajmniej jedna z klauzul catch lub finally. Jeżeli nie chce się obsługiwać wyjątków w konkretnym miejscu, to instrukcja ta przybiera postać try {/.../} finally {/.../}. Taka postać występuje najczęściej przy synchronizowaniu dostępu wielowątkowego (organizowaniu blokad do zasobów - w tym plików).

ps. W tym konkretnym wypadku metoda nie rzuca wyjątkiem, ale tylko zapowiada możliwość jego wyrzucenia. Wszystkie klasy dziedziczące po tej klasie muszą mieć taką samą metodę, które też mają mieć możliwość rzucania wyjątku. Na przykład zamykanie strumienia w pamięci zawsze się uda i metoda close() takiej klasy nigdy nie będzie musiała rzucić wyjątku. Ale w przypadku gdy jakiś potomek tej klasy będzie obsługiwać już realne pliki czy np. połączenie z satelitą, to metoda może się nie udać, a używający klasy musi mieć możliwość obsłużenia takiej sytuacji.

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