#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 /… , следовательно, он все равно не будет пойман