PrintWriter仅写入文本文件首行,finally块已关流仍异常如何解决?
故障原因分析
- 异常被静默吞噬,循环提前终止:代码中的catch块为空实现,没有任何日志打印或异常抛出逻辑,只要while循环内部出现任何异常,会直接跳出循环进入finally块,此时仅完成了第一行数据的读取和写入,后续行都未处理,这是仅输出第一行的直接原因。
- Scanner分隔符适配错误,换行符匹配失败:你设置的分隔符为
[/\n],仅能匹配/和\n两种字符,但Windows系统下文本文件的换行符为\r\n,第一行末尾的\r没有被识别为分隔符,会被当做下一个token的内容,此时调用Sc1.nextInt()读取第二行的dbcuid时,拿到的是带\r的非数字字符串,直接抛出InputMismatchException触发循环终止。这也符合你提到的「未做明显修改突然出现问题」的特征:大概率是Centre.txt文件被在Windows系统下编辑过,换行符从\n变为了\r\n,触发了该适配问题。
修复方案
- 修改Scanner分隔符为
[/\\r?\\n],兼容Windows、Linux、macOS多系统的换行格式,也可以用"[/\\n]+"匹配连续分隔符,避免空token干扰读取逻辑。 - 移除空的catch块,要么向上抛出异常,要么添加
e.printStackTrace()打印异常栈,禁止静默吞噬异常,否则会大幅提升问题排查难度。 - 简化资源关闭逻辑:调用
pw1.close()时会自动关闭它包装的BufferedWriter和FileWriter,不需要重复手动关闭内层流,避免重复关闭导致的异常。 - 初始化FileWriter时移除追加模式参数
true,每次生成Temp.txt应当是全新内容,避免旧文件残留内容干扰最终结果。
内容的提问来源于stack exchange,提问作者Syramid
相关产品推荐
相关产品推荐

