В Java методы, которые бросают проверенные исключения (Exception или его подтипы - IOException, InterruptedException, и т.д.) должен объявить инструкцию throws:
public abstract int read() throws IOException;
Способы, объявляющие throws
оператор не могут исключать проверенные исключения.
public int read() { // does not compile
throw new IOException();
}
// Error: unreported exception java.io.IOException; must be caught or declared to be thrown
Но ловушка проверенных исключений в безопасных методах все еще легальна в java:
public void safeMethod() { System.out.println("I'm safe"); }
public void test() { // method guarantees not to throw checked exceptions
try {
safeMethod();
} catch (Exception e) { // catching checked exception java.lang.Exception
throw e; // so I can throw... a checked Exception?
}
}
Собственно, нет. Это немного смешно: компилятор знает, что e не является проверенным исключением и позволяет его перестроить. Все это даже немного смешно, этот код не компилируется:
public void test() { // guarantees not to throw checked exceptions
try {
safeMethod();
} catch (Exception e) {
throw (Exception) e; // seriously?
}
}
// Error: unreported exception java.lang.Exception; must be caught or declared to be thrown
Первый фрагмент был мотивом для вопроса.
Компилятор знает, что проверенные исключения не могут быть выбраны в безопасном методе - так что, возможно, он должен улавливать только непроверенные исключения?
Возвращаясь к главному вопросу - существуют ли какие-либо причины для реализации catching проверенных исключений таким образом? Это всего лишь недостаток дизайна, или я не хватает некоторых важных факторов - возможно, отсталых несовместимостей? Что могло бы пойти не так, если в этом сценарии было разрешено использовать только RuntimeException
? Примеры приветствуются.