Когда использовать броски в объявлении метода Java?
-
10-10-2019 - |
Вопрос
Поэтому я подумал, что у меня было хорошее базовое понимание обработки исключений в Java, но недавно я читал какой-то код, который дал мне некоторую путаницу и сомнения. Мое главное сомнение в том, что я хочу обратиться здесь к тому, когда человек использует, бросает броски в объявлении метода Java, как следующее:
public void method() throws SomeException
{
// method body here
}
От прочтения некоторых похожих постов я собираю это броски используется как своего рода заявление, что Какое -то экспрессия может быть брошен во время выполнения метода.
Моя путаница исходит от какого -то кода, который выглядел так:
public void method() throws IOException
{
try
{
BufferedReader br = new BufferedReader(new FileReader("file.txt"));
}
catch(IOException e)
{
System.out.println(e.getMessage());
}
}
Есть ли причина, по которой вы хотели бы использовать броски В этом примере? Кажется, что если вы просто делаете базовую обработку исключений чего-то вроде ioException, что вам просто понадобится блок Try/Catch, и все.
Решение
Если вы ловите тип исключения, вам не нужно бросать его, если только вы не собираетесь переосмыслить его. В примере, который вы публикуете, разработчик должен был сделать так или иное, а не оба.
Как правило, если вы не собираетесь ничего делать за исключением, вы не должны его поймать.
Самая опасная вещь, которую вы можете сделать, - это поймать исключение и ничего с этим не делать.
Хорошее обсуждение, когда уместно бросить исключения, здесь есть
Другие советы
Вам нужно включить предложение броска в метод, если метод бросает проверенное исключение. Если метод бросает исключение времени выполнения, то это не нужно.
Смотрите здесь для некоторого предыстория на зарегистрированных против неконтролируемых исключениях: http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html
Если метод поймает исключение и имеет дело с ним внутренне (как во втором примере), то нет необходимости включать пункт о бросках.
Код, на который вы смотрели, не идеален. Вы должны либо:
Поймать исключение и справиться с ним; в этом случае
throws
это ненужное.Удалить
try/catch
; В этом случае исключение будет обрабатываться методом вызова.Поймайте исключение, возможно, выполните какое -то действие, а затем переосмыслить исключение (не только сообщение)
Вы правы, в этом примере throws
излишне. Вполне возможно, что он был оставлен там от какой -то предыдущей реализации - возможно, исключение было первоначально брошено вместо того, чтобы попасть в блок улова.
В данном примере, который вы дали, метод никогда не будет выбросить ioException, поэтому объявление неверно (но действителен). Я предполагаю, что исходный метод бросил ioException, но затем он был обновлен, чтобы справиться с исключением внутри, но объявление не было изменено.
Код, который вы опубликовали, неверен, он должен бросить исключение, если улавливает конкретное исключение, чтобы обработать 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());
}
}
Это не ответ, а комментарий, но я не мог написать комментарий с форматированным кодом, так что вот комментарий.
Допустим, есть
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 (не контролируемые), которые не нужно объявить на методе. Это немного вводит в заблуждение для читателя метода, так как все, что она видит, это «брось E»; Заявление, но нет декларации исключения бросков
Теперь, если у нас есть
public static void main(String[] args) throws Exception {
try {
throw new Exception("test");
} catch (Exception e) {
System.out.println(e.getMessage());
throw e;
}
}
Мы должны объявить исключения «броски» в методе, иначе мы получаем ошибку компилятора.