Подтвердить что ты не робот

Когда использовать броски в объявлении метода 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 и его.

4b9b3361

Ответ 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" в методе, иначе мы получим ошибку компилятора.