Когда использовать броски в объявлении метода Java?
Итак, я думал, что у меня есть хорошее базовое понимание обработки исключений на Java, но недавно я прочитал некоторый код, который дал мне некоторую путаницу и сомнения. Мое главное сомнение в том, что я хочу здесь остановиться, когда человек должен использовать броски в объявлении метода Java, например:
public void method() throws SomeException
{
// method body here
}
Из чтения некоторых похожих сообщений я понимаю, что throws используется как своего рода объявление о том, что SomeException может быть запущено во время выполнения метода.
Моя путаница исходит из кода, который выглядит так:
public void method() throws IOException
{
try
{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
Есть ли причина, по которой вы хотели бы использовать throws в этом примере? Похоже, что если вы просто выполняете базовую обработку исключений, например, исключение IOException, вам просто нужен блок try/catch и его.
Ответы
Ответ 1
Если вы ловите тип исключения, вам не нужно его бросать, если вы не собираетесь его реконструировать. В примере, который вы публикуете, разработчик должен был сделать то или другое, а не оба.
Как правило, если вы не собираетесь ничего делать с исключением, вы не должны его поймать.
Самое опасное, что вы можете сделать, это поймать исключение и ничего не делать с ним.
Хорошее обсуждение того, когда уместно бросать исключения, здесь
Когда бросать исключение?
Ответ 2
Вам нужно включить предложение throws в метод, если метод выдает исключенное исключение. Если метод генерирует исключение во время выполнения, тогда нет необходимости делать это.
См. здесь несколько примеров исключенных исключений: http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html
Если метод ловит исключение и обрабатывает его внутренне (как и во втором примере), нет необходимости включать предложение throws.
Ответ 3
Код, который вы смотрели, не идеален. Вы должны либо:
-
Поймать исключение и обработать его;
в этом случае throws
unnecesary.
-
Удалите try/catch
; в таком случае
Исключение будет обрабатываться
вызывающий метод.
-
Поймать исключение, возможно
совершить какое-то действие, а затем реконструировать
исключение (а не только сообщение)
Ответ 4
Вы правы, в этом примере throws
является излишним. Возможно, что он остался там из какой-то предыдущей реализации - возможно, исключение было изначально выбрано вместо того, чтобы попасть в блокирующий блок.
Ответ 5
В примере, который вы указали, метод никогда не будет генерировать исключение IOException, поэтому декларация неверна (но действительна). Я предполагаю, что исходный метод бросил IOException, но затем был обновлен для обработки исключения внутри, но объявление не было изменено.
Ответ 6
Код, который вы опубликовали, ошибочен, он должен вызывать исключение, если обнаруживает конкретное исключение для исключения IOException обработчика, но не выбрасывает исключенные исключения.
Что-то вроде:
public void method() throws Exception{
try{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}catch(IOException e){
System.out.println(e.getMessage());
}
}
или
public void method(){
try{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}catch(IOException e){
System.out.println("Catching IOException");
System.out.println(e.getMessage());
}catch(Exception e){
System.out.println("Catching any other Exceptions like NullPontException, FileNotFoundExceptioon, etc.");
System.out.println(e.getMessage());
}
}
Ответ 7
Это не ответ, а комментарий, но я не мог написать комментарий с отформатированным кодом, поэтому вот комментарий.
Допустим, что существует
public static void main(String[] args) {
try {
// do nothing or throw a RuntimeException
throw new RuntimeException("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
Выходной сигнал
test
Exception in thread "main" java.lang.RuntimeException: test
at MyClass.main(MyClass.java:10)
Этот метод не объявляет никаких "бросков" Исключения, но бросает их!
Фокус в том, что заброшенные исключения - это RuntimeExceptions (unchecked), которые не требуются для объявления в методе.
Это немного вводит в заблуждение читателя метода, поскольку все, что она видит, это "бросок"; а не объявление исключения исключений
Теперь, если мы имеем
public static void main(String[] args) throws Exception {
try {
throw new Exception("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
Мы ДОЛЖНЫ объявить исключения "throws" в методе, иначе мы получим ошибку компилятора.