Java文件访问报错求助:NullPointerException及路径问题排查
问题分析与修复方案
你的代码存在三个核心问题,直接导致了空指针异常和文件读取失败:
1. 文件读取失败后未中断流程,触发空指针异常
当FileReader初始化失败(比如文件找不到),你的catch块仅打印提示,但后续代码依然执行new BufferedReader(doc)——此时doc为null,必然抛出NullPointerException。
修复方式:在catch块中直接返回结果或终止方法,避免后续操作null对象。
2. 文件路径的确认要点
不管带不带盘符,你需要逐一排查以下几点:
- 路径分隔符:Windows下支持
/或转义后的\\(例如"C:\\Users\\apple\\Desktop\\FRASES_FOR_HANGMAN.txt"),两种写法均有效 - 文件真实存在:到桌面核对文件名是否完全一致(注意拼写,比如有没有把
HANGMAN写成HANGMEN) - 权限问题:确保Java程序有权限读取桌面文件(避免用管理员权限运行IDE,反而可能引发权限不足)
- 桌面路径异常:如果桌面开启了OneDrive同步,实际路径可能是
C:/Users/apple/OneDrive/Desktop/...,可右键文件→属性查看真实路径
3. 文件读取逻辑错误与资源泄漏
- 当前循环会用每一行内容覆盖
linea,最终返回的是null(因为readLine()读到文件末尾会返回null,循环退出时linea就是null) - 未手动关闭
FileReader和BufferedReader,会造成系统资源泄漏
修正后的完整代码:
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; public class GeneradorFrases { public String leeDoc() { // 使用try-with-resources自动关闭资源,无需手动调用close try (FileReader doc = new FileReader("C:/Users/apple/Desktop/FRASES_FOR_HANGMAN.txt"); BufferedReader buff = new BufferedReader(doc)) { StringBuilder contenido = new StringBuilder(); String linea; // 循环读取每一行并追加到StringBuilder while ((linea = buff.readLine()) != null) { contenido.append(linea).append("\n"); } // 返回内容时去掉最后多余的换行符 return contenido.length() > 0 ? contenido.substring(0, contenido.length() - 1) : ""; } catch (IOException e) { // 打印详细错误信息,方便排查具体问题 System.out.println("读取文件出错:" + e.getMessage()); // 读取失败时返回空字符串,可根据需求调整为null return ""; } } }
代码说明:
try-with-resources语法会自动关闭实现AutoCloseable接口的资源,彻底避免资源泄漏- 用
StringBuilder存储所有行内容,解决原代码中内容被覆盖的问题 - 统一捕获
IOException(FileNotFoundException是它的子类),打印具体错误信息便于排查路径或权限问题 - 读取失败时直接返回,不会执行后续错误代码
内容的提问来源于stack exchange,提问作者luluconcha
相关产品推荐
相关产品推荐

