Когда использовать броски в объявлении метода Java?

StackOverflow https://stackoverflow.com/questions/4392446

  •  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

Если метод поймает исключение и имеет дело с ним внутренне (как во втором примере), то нет необходимости включать пункт о бросках.

Код, на который вы смотрели, не идеален. Вы должны либо:

  1. Поймать исключение и справиться с ним; в этом случае throws это ненужное.

  2. Удалить try/catch; В этом случае исключение будет обрабатываться методом вызова.

  3. Поймайте исключение, возможно, выполните какое -то действие, а затем переосмыслить исключение (не только сообщение)

Вы правы, в этом примере 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;
  }
}

Мы должны объявить исключения «броски» в методе, иначе мы получаем ошибку компилятора.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top