这段Java代码异常处理是否完善?是否缺少finally块关闭文件对象?
Java文件操作代码异常处理方案
- 你担心的问题确实存在:
FileWriter创建成功后,后续的GetData.getWord()调用、字符写入、flush()操作都可能抛出IOException,一旦这些环节抛出异常,现有代码中的print.close()就不会被执行,会直接导致文件句柄泄漏,必须做额外的资源释放处理。
方案1:添加finally块适配低版本Java
如果你使用的是Java 6及更早版本,需要手动把资源关闭逻辑放到finally块中,保证只要FileWriter实例创建成功就一定会被关闭,修改后的代码如下:
void appendFile() throws IOException{ FileWriter print = null; try { print = new FileWriter(f, true); String info = GetData.getWord("Write desired info to File"); print.append(" "); print.append(info); System.out.println("this executes"); print.flush(); } finally { // 只有print实例不为空才需要关闭 if (print != null) { try { print.close(); } catch (IOException closeException) { // 关闭操作的异常可按需处理,例如记录日志 closeException.printStackTrace(); } } } }
方案2:使用try-with-resources语法(Java 7+推荐)
Java 7之后推出的自动资源管理语法,会自动实现AutoCloseable接口的资源的关闭逻辑,不需要手动编写finally块,代码更简洁且不易出错,修改后的代码如下:
void appendFile() throws IOException{ // FileWriter实现了AutoCloseable接口,会在try块结束后自动关闭 try (FileWriter print = new FileWriter(f, true)) { String info = GetData.getWord("Write desired info to File"); print.append(" "); print.append(info); System.out.println("this executes"); print.flush(); } }
额外提示:你现有代码中先调用
fileExist()判断文件存在再执行写入的逻辑存在竞态条件:判断文件存在之后、创建FileWriter之前,文件可能被其他进程删除,依然会抛出FileNotFoundException,所以不需要提前做文件存在性判断,直接捕获写入阶段的异常处理即可。
内容的提问来源于stack exchange,提问作者Jane B.
相关产品推荐
相关产品推荐

