2011-11-10 7 views
6

Im bardziej precyzyjna rethrow pozwala na pisanie kodu, który zgłasza wyjątek rzeczywiście rzucone:Java 7 precyzyjny rethrow i dziedzictwo kod

public void foo(String bar) throws FirstException, SecondException { 
    try{ 
     // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
     throw e; 
    } 
    } 

Przed Java 7 trzeba było napisać:

public void foo(String bar) throws Exception { 
    try{ 
     // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
     throw e; 
    } 
    } 

My pytanie: czy istnieje narzędzie umożliwiające wykrycie nieprecyzyjnego rzutu w celu zastąpienia "Exception" za pomocą "FirstException, SecondException"?

Do tej pory sprawdziłem, że nie ma ostrzeżenia kompilatora w Eclipse. Nie ma reguły w FindBugs lub CodePro.

+0

Proponuję dodać następujące zdanie do pytania: "Mój cel jest ..." Jak dotąd nie otrzymałeś dobrej rady, ponieważ ludzie błędnie odgadywali twój cel. –

+1

Myślę, że pytanie jest całkiem jasne: Aby zaktualizować starszy kod, który został napisany leniwie, aby wyrzucić zbyt szeroki wyjątek, istnieje narzędzie, które znajdzie taki kod, aby można było go zaktualizować za pomocą nowej, wygodnej składni Java7. – Thilo

Odpowiedz

-2

Spróbuj rzucić wyjątek przed rzutem, może to załatwi sprawę?

public void foo(String bar) throws FirstException, SecondException { 
    try{ 
    // Code that may throw both FirstException and SecondException 
    } 
    catch (Exception e){ 
    throw ((e instanceof FirstException) ? (FirstException)e : (SecondException)e); 
    } 
} 

BTW Ponowne generowanie tego samego wyjątku wydaje się raczej niezdarny coś do mnie ...

+2

Chodzi o to, że w Javie 7 jest to ** nie ** konieczne: możesz użyć 'throws FirstException, SecondException' ** i ** użyć prostego' throw e'. –

1

myślę, że to nie jest to sytuacja dla ostrzeżenia kompilatora, bo „zbyt szeroki” wyjątek niekoniecznie jest problemem : O ile metoda nie jest ostateczna lub prywatna, określa ona, jakiego rodzaju wyjątku może użyć dowolna implementacja podklasy. W takim przypadku szeroki zakres mógł być zamierzony.

Twoje pytanie byłoby zastosować równie dobrze dla Java sprzed 7:

public void foo(String bar) throws Exception { 
    // Code that may throw both FirstException and SecondException 
} 

Tutaj throws Exception może również uznać złe praktyki (ale nie ma ostrzeżenia o tym).

Wzdłuż tej samej argumentacji, trzeba pamiętać, że dostaniesz błąd kompilacji podczas próby połowu (zaznaczone) wyjątkiem, że nie mogą ewentualnie być wyrzucone, ale można dodać do klauzuli podpisu metody throws wszystko rodzaje wyjątków, których nie stosuje organ wdrażający.

Przydatne byłoby jednak narzędzie takie jak FindBugs.


Aktualizacja: „O ile metoda jest ostateczna lub prywatny”: Muszę się zgodzić, że dla metod prywatnych lub końcowych (i jedynek może statycznych też) nie może być ostrzeżeniem.

Aktualizacja 2: Nawet w przypadku metod ostatecznych, możesz pozostawić otwarte opcje, aby rzucić więcej wyjątków w przyszłości bez naruszania interfejsu.