2015-02-03 3 views
2

Я только что понял, что могу написать метод, объявляющий одно и то же проверенное исключение несколько раз.Объявление одного проверенного исключения несколько раз

public void myMethod() throws MyException, MyException, MyException { 

Я не могу придумать причину, по которой я хотел бы это сделать. Я искал какое-то время, но я не могу найти, есть ли ресурс, который объясняет, почему это приемлемо или как это может быть хорошо. Может ли кто-нибудь указать мне на какой-то ресурс об этом?

+0

Как вы думаете, что означает «броски»? –

+1

Синтаксис иногда позволяет много нелогичных вещей, вопрос в том, почему вы пишете такое? – m0skit0

+0

Вы можете исключить только одно исключение из метода, потому что это делает передачу управления от метода. то есть больше кода из метода не выполняется, когда генерируется исключение. – DennisW

ответ

4

В JLS нет ничего, что мешает вам указывать один и тот же тип исключения (или даже подтипы) в предложении throws. Единственное ограничение, в соответствии с JLS, Section 8.4.6, является:

Это ошибка во время компиляции, если ExceptionType упоминается в пункте throws не является подтипом (§4.10) из Throwable.

Таким образом, это составляет:

throws RedundantException, RedundantException, RedundantException 

Мой IDE предупреждает меня о "Дубликат бросков", но это не ошибка компилятора.

Я не вижу веских оснований для этого. Мне никогда не приходило в голову, что я пытаюсь это сделать.

компилируется, даже если MySubclassException подклассы MyException:

throws MyException, MySubclassException, MyException, MySubclassException 

Единственная причина, я могу думать, чтобы перечислить подклассов типы исключений в пункте throws является документом в собственном Javadocs, что подкласс может быть выброшен, поэтому его можно обрабатывать отдельно.

@throws MyException If something general went wrong. 
@throws MySubclassException If something specific went wrong. 

Несмотря на это, моя IDE предупреждает меня о «более общем исключении» в списке.

Кстати, не имеет значения, проверен ли какой-либо из типов исключений в приведенных выше примерах.

+0

Практический пример: некоторые методы в java.nio throw IOException, а также «необязательное конкретное исключение», например FileAlreadyExistsException (подтип IOException). –

1

Как уже упоминалось в rgettman's answer, семантического значения для дубликатов throws. Тем не менее, до сих пор javac записывает их в скомпилированный файл класса, что делает их доступными для отражения, как можно видеть в следующем примере:

public class Main { 
    public static void main(String[] args) throws IOException, IOException, 
      IOException, NoSuchMethodException { 
     Arrays.stream(Main.class.getMethod("main", String[].class).getExceptionTypes()) 
       .forEachOrdered(System.out::println); 
    } 
} 

который печатает

class java.io.IOException 
class java.io.IOException 
class java.io.IOException 
class java.lang.NoSuchMethodException 

Это не полезно (и вероятно, подвергает сомнительных потребителей Method.getExceptionTypes()), но это поведенческая разница, вызванная дубликатными объявлениями throws.