Есть ли какое-либо использование для вложенной попытки, если без улова?

#java #oop #exception #io #try-catch

#java #ооп #исключение #io #try-catch

Вопрос:

Наткнулся на приведенный ниже код из книги по Java

 public void writeFile(String fileName, String content){
    File file = new File(fileName);

    try {
        try (PrintWriter output = new PrintWriter(new FileWriter(file))) {
          output.println(content);
          output.println();
          output.println("End of writing");
        }
        System.out.println("File been written successfully");
    } catch (IOException ex) {
      ex.printStackTrace(System.out);
    }
}

  

В приведенном выше коде нет ничего плохого, я просто не видел смысла в том, чтобы иметь вложенный try , который не определяет внутренний блок catch . Или есть какая-то цель для этого, в которой я это пропустил?

Пересмотренный код:

 public void writeFile(String fileName, String content){
    File file = new File(fileName);

    try (PrintWriter output = new PrintWriter(new FileWriter(file))) {
        output.println(content);
        output.println();
        output.println("End of writing");
        System.out.println("File been written successfully");
    } catch (IOException ex) {
      ex.printStackTrace(System.out);
    }
}
  

Комментарии:

1. Внутренняя попытка автоматически закроет ресурс PrintWriter, из jdk 9 вы можете попробовать без finally или catch

2. docs.oracle.com/javase/tutorial/essential/exceptions/…

3. @Deadpool: другими словами, перед jdk 9 разработчику обычно приходится вручную закрывать его в finally блоке?

4. Да, именно @Isaac, и в основном вы делаете все это за одну попытку улова, не нужно внутреннего

5. Я не думаю, что имеет смысл использовать внутренний catch.

Ответ №1:

Внутренняя попытка — это попытка с ресурсами:

 try (PrintWriter output = new PrintWriter(new FileWriter(file)))
  

это означает, что он управляет ресурсом PrintWriter — открывает его и закрывает после выполнения каждого оператора в этой попытке. Внешняя попытка используется для обнаружения ошибки.

Ваш пересмотренный код, предложенный Петтером Фрибергом, эквивалентен.

Комментарии:

1. Вместо этого вы могли бы использовать внутренний catch, я не вижу особой цели

2. @PetterFriberg ты имеешь в виду finally ?

3. Нет, просто внутренний улов, тот же код без внешнего улова try

4. «эквивалентно» не совсем. В исходном коде сообщение об успешном завершении записывается после закрытия средства записи. В пересмотренном коде он записывается перед закрытием. При закрытии может возникнуть исключение.

5. @AndyTurner программа PrintWriter, начиная с java 7, не будет вызывать исключение IOException при закрытии() AFIK docs.oracle.com/javase/7/docs/api/java/io /… , следовательно, он все равно не будет пойман