2012-05-09 15 views
14

Czy ktoś może mi powiedzieć, co może mieć wyjątki powodów, aby nie być kompatybilne z „rzuca” klauzuleJakie są przyczyny wyjątków, które nie są zgodne z klauzulami rzutów?

Na przykład:

class Sub extends Super{ 

    @Override 
    void foo() throws Exception{ 

    } 

} 

class Super{ 

    void foo() throws IOException{ 

    } 
} 

Wyjątek Wyjątek nie jest kompatybilny z rzutów klauzuli Super.foo()

+1

Pokaż nam pełny kod demonstrujący problem. W tym również w pełni kwalifikowana nazwa klasy dla 'wyjątków'. –

+1

możesz pokazać nieco więcej swojego kodu i dokładny błąd, który otrzymujesz? – aniri

+0

Mój działa. Powinieneś pokazać nam więcej kodu. – Averroes

Odpowiedz

22

Bez pełnego przykładu kodu, mogę tylko zgadywać: nadpisujesz/implementujesz metodę w podklasie, ale specyfikacja wyjątku metody podklasy nie jest zgodna z (tj. Nie jest podzbiorem) tej nadklasy/metoda interfejsu?

Może się to zdarzyć, jeśli metoda podstawowa ma zadeklarować, że nie generuje żadnych wyjątków, lub np. java.io.IOException (która jest podklasą java.lang.Exception, którą twoja metoda próbuje tu wyrzucić). Klienci klasy bazowej/interfejsu oczekują, że jego instancje będą zgodne z umową zadeklarowaną metodą podstawową, więc wyrzucenie Exception z wdrożenia tej metody złamałoby umowę (i LSP).

+0

Dziękuję Péter Török- Issue closed –

+0

I wiem, że to nie jest strona dyskusyjna - ale nie rozumiem, dlaczego LSP nie pozwala ** dodać ** coś ..!? –

+6

Pozwala na dodanie czegoś. Ale gdy dodajesz typ wyjątku do przesłoniętej metody, nie dodajesz czegoś, ale usuwasz coś: z klasą podstawową gwarantujesz, że nigdy nie otrzymasz wyjątku, ale z podklasą stracisz tę gwarancję. Dlatego jest to zabronione. –

-1

Sprawdzone wyjątki są przeznaczone do stosowania w sytuacjach, w których metoda może oczekiwać, że jej rozmówca będzie przygotowany na rozwiązanie pewnych problemów, które mogą się pojawić. Jeśli osoby dzwoniące pod numerami BaseFoo.Bar() nie są wymagane do obsługi numeru FnordException, to metoda DerivedFoo.Bar() nie może oczekiwać, że jego rozmówcy będą mieli do czynienia z FnordException (ponieważ wielu z nich będzie takich samych, którzy nie byli przygotowani, aby go wyrzucić).

Pojęciowo, to świetnie. W praktyce nie tak bardzo. Problem polega na tym, że projekt sprawdzonych wyjątków w języku zakłada, że ​​żaden z dzwoniących nie będzie przygotowany na radzenie sobie z konkretnym problemem, albo wszyscy rozmówcy będą przygotowani na to. Normalnym stanem rzeczy w praktyce jest, aby rozmówcy byli nieprzygotowani do radzenia sobie z wyjątkami - nawet tymi, z którymi niektórzy rozmówcy mogliby sobie poradzić. Przez większość czasu prawidłowym działaniem, gdy kod otrzymuje sprawdzony wyjątek, którego nie oczekuje się, byłoby zapakowanie go w niesprawdzony wyjątek i wyrzucenie go. Jak na ironię, najłatwiejszy sposób działania - dodanie klauzuli "throws" i zezwolenie na sprawdzanie wyjątkowego bańki, jest prawdopodobnie najmniej prawdopodobne. Chociaż istnieje kilka przypadków (np. IOException), gdzie takie zachowanie miałoby sens (np. Podczas próby odczytania kolekcji z pliku, błąd wejścia/wyjścia podczas odczytu jednego elementu jest błędem wejścia/wyjścia podczas odczytu kolekcji), wyjątek wyrzucony z zagnieżdżonego wywołania metody będzie reprezentował inny warunek, niż wyjątek tego samego typu rzucany przez zewnętrzną metodę, a kod, który byłby przygotowany do obsługi tego ostatniego, może nie być przygotowany do obsługi tego pierwszego.

W Twojej sytuacji najlepiej jest złapać IOException i zawinąć go w inny typ, który pochodzi od RuntimeException, mając świadomość, że twoi rozmówcy raczej nie będą w stanie sobie z tym poradzić.

-1

go naprawić używać RuntimeException

public T findById(long id) throws RuntimeException { 
    try { 
      return whatEver.create(); 
    } catch (SystemException e) { 
      throw new RuntimeException(e); 
    } 
} 

nadzieję, że to pomaga.

-1

Upewnij się, że zadeklarowałeś użycie interfejsu. Jeśli tak, ale problem nadal występuje - spróbuj zapisać/odbudować projekt.

+0

Nie sądzę, że to jest droga. –

Powiązane problemy