Я читаю более точные броски в java 7 http://docs.oracle.com/javase/7/docs/technotes/guides/language/catch-multiple.html, в котором говорится:
Подробно, в Java SE 7 и более поздних версиях, когда вы объявляете один или несколько типов исключений в предложении catch и регенерируете исключение, обрабатываемое этим блоком catch, компилятор проверяет, что тип повторного исключения соответствует следующим условиям:
The try block is able to throw it. There are no other preceding catch blocks that can handle it. It is a subtype or supertype of one of the catch clause exception parameters.
поэтому я написал программу для ее проверки.
public class MorePreciseRethrow {
public static void main(String args[]){
try {
foo("First");
} catch (FirstException e) {
e.printStackTrace();
} catch (SecondException e) {
e.printStackTrace();
}
}
private static void foo(String exceptionName) throws FirstException, SecondException{
try{
if(StringUtils.equals("First",exceptionName)){
throw new FirstException();
}
}catch(Exception e){
throw e;
}
}
}
class FirstException extends Exception{
}
class SecondException extends Exception{
}
но это не порождает даже предупреждения компилятора с помощью jdk7. Теперь мой блок try никогда не сможет запустить SecondException, но мой компилятор не проверял его. Является ли указанная строка в документе неправильной или я ошибаюсь?
Компилятор проверяет, только заголовок метода
private static void foo(String exceptionName) throws FirstException, SecondException
исключает исключение.
У вас может быть несколько реализаций методов, поэтому одна реализация может выдать exeption, а другая нет. но оба должны быть в постели.
В Java нет требования, что код в методе, который объявляет, что он throws
исключение на самом деле быть в состоянии бросить его.
Это имеет смысл, потому что метод может реализовывать интерфейс, но реализация происходит, чтобы не бросать его, или это может позволить будущему расширению реализации/подкласса, который его бросает.
Чтобы получить ошибку компиляции, о которой говорит документация, вам нужно использовать множественный захват. Что-то вроде,
private static void foo(String exceptionName) throws FirstException,
SecondException {
try {
throw new FirstException();
} catch (FirstException | SecondException e) {
throw e;
}
}
Создает UnreachableCodeBlock
для SecondException
в Java 7+.
Exception
. И (опять же) ваша ссылка для multi-catch
.