Java 7 точный пересчет и унаследованный код - PullRequest
6 голосов
/ 10 ноября 2011

Более точная повторная обработка позволяет написать код, который выдает действительно выданное исключение:

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

До Java 7 вам приходилось писать:

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

Мой вопрос: есть ли инструмент, который позволяет обнаруживать неточный бросок, чтобы заменить "Exception" на "FirstException, SecondException"?

До сих пор я проверял, что в Eclipse нет предупреждения компилятора,В FindBugs или CodePro нет правил.

Ответы [ 2 ]

1 голос
/ 10 ноября 2011

Я думаю, что это не ситуация для предупреждения компилятора, потому что «чрезмерно широкое» исключение не обязательно является проблемой: если метод не является окончательным или закрытым, он определяет, какое исключение может генерировать любая реализация подкласса.В этом случае широкая область может быть преднамеренной.

Ваш вопрос одинаково хорошо подходит для Java до 7:

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

Здесь throws Exception также может считаться плохой практикой(но предупреждений об этом нет).

В этой же строке аргумента обратите внимание, что вы получите ошибку при компиляции при попытке перехватить (проверенное) исключение, которое не может быть выдано, но вы можете добавить к throws предложение сигнатуры метода всех видов исключений, которые не используются в теле реализации.

Хотя бы полезен такой инструмент, как FindBugs.


Обновление: "Если метод не являетсяfinal или private ": я должен согласиться с тем, что для приватных или финальных методов (и, возможно, статических тоже) может быть предупреждение.

Обновление 2. Даже для финальных методов вы можете оставить свои параметрыоткрыт, чтобы выдавать больше исключений в будущем, не нарушая интерфейс.

0 голосов
/ 10 ноября 2011

Попробуйте разыграть исключение перед броском, может быть, это поможет?

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);
  }
}

Кстати, отбросить то же исключение мне кажется довольно неуклюжим ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...