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


    public void method() throws SomeException
    {
         // method body here
    }

из чтения некоторых подобных сообщений я понял, что закидываем используется как своего рода объявление, что SomeException может быть брошен во время выполнения метод.

моя путаница исходит из какого-то кода, который выглядел так:

     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, и все.

7 79

7 ответов:

Если вы ловите тип исключения, вам не нужно его выбрасывать, если вы не собираетесь его перестраивать. В Примере, который вы публикуете, разработчик должен был сделать одно или другое, а не оба.

Как правило, если вы не собираетесь делать ничего с исключением, вы не должны поймать его.

самое опасное, что вы можете сделать, это поймать исключение и ничего не делать с ним.

хорошее обсуждение того, когда уместно бросать исключения здесь

когда выбрасывать исключение?

вам нужно только включить предложение throws для метода, если метод вызывает проверенное исключение. Если метод вызывает исключение во время выполнения, то нет необходимости делать это.

смотрите здесь для некоторого фона на checked vs unchecked исключения:http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html

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

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

  1. поймать исключение и обработать его; в этом случае throws is без необходимости.

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

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

вы правы, в этом примере throws Это лишнее. Возможно, что он был оставлен там из какой - то предыдущей реализации-возможно, исключение было первоначально брошено вместо того, чтобы быть пойманным в блоке catch.

в приведенном примере метод никогда не будет вызывать исключение 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 (unchecked), которые не нужно объявлять в методе. Это немного вводит в заблуждение читателя метода, так как все, что она видит является оператором" throw e;", но не объявляет исключение бросков

Теперь, если у нас есть

public static void main(String[] args) throws Exception {
  try {
    throw new Exception("test");
  } catch (Exception e) {
    System.out.println(e.getMessage());
    throw e;
  }
}

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