Java将List逐行写入文件后内容为空,如何排查解决?
问题原因及解决方案
故障原因
- 参数遮蔽导致传入空集合
你代码中定义了同名的成员变量myList和saveToFile方法的入参myList,如果你能正常打印的是成员变量里的内容,但调用saveToFile方法时误传了空集合作为参数,方法内遍历的就是空集合,自然没有内容输出到文件。 - 异常捕获范围不全
UIFileChooser.save()方法如果用户在文件选择弹窗点击取消时会返回null,此时创建PrintStream会抛出NullPointerException,这是运行时异常,不会被你代码中仅捕获的IOException捕获,方法会直接终止运行,写入逻辑和close()都不会执行,缓冲区内容不会写入文件,也不会输出你预设的报错提示。 - 资源关闭逻辑不可靠
你当前把close()写在try块内部,如果写入过程中出现异常,close()方法不会执行,PrintStream缓冲区的内容不会刷入磁盘,也会导致文件为空。
修复方案
修改方法参数名避免重名问题,先校验文件选择结果避免空指针,使用try-with-resources语法自动关闭资源,保证缓冲区内容刷入磁盘。
修改后的代码如下:
public List <String> myList = new ArrayList<String>(); public void saveToFile(List<String> listToSave) { String filename = UIFileChooser.save("Filename to save to"); // 先判断用户是否选择了文件 if (filename == null) { return; } // 校验传入的集合是否有内容 if (listToSave == null || listToSave.isEmpty()) { UI.println("待写入集合为空,无内容写入"); return; } // 使用try-with-resources自动关闭资源,无需手动关闭 try (PrintStream outfile = new PrintStream(filename)) { for (String line: listToSave) { outfile.println(line); } } catch (Exception e) { UI.println("文件操作失败: " + e); } }
调用该方法时传入你实际打印过、确认有内容的集合即可,比如调用saveToFile(myList)。
内容的提问来源于stack exchange,提问作者Osca
相关产品推荐
相关产品推荐

