读取文件触发NullPointerException,原正常Java代码现异常求助
问题:Java程序读取文件时抛出NullPointerException,无法找到文件
两年前编写的Java程序,需两个文件作为命令行参数读取,此前运行正常且经多次测试。从提交版本下载项目后,将所需文件放到主Java文件同目录,运行命令java mainFile first_file.txt second_file.txt时出现报错:
Welcome to "Name of school project" Exception in thread "main" java.lang.NullPointerException at practice.collection.Collection.download(Collection.java:100) at practice.UI.UI.mainLoop(UI.java:63) at mainFile.main(mainFile.java:60)
Collection类的download方法代码如下:
public void download(String fileName) { Scanner fileReader = null; try { File file = new File(fileName); fileReader = new Scanner(file); while (fileReader.hasNextLine()) { ***reads lines and does some sorting*** } fileReader.close(); } catch (FileNotFoundException | NumberFormatException e) { fileReader.close(); ***this is line 100*** System.out.println("Missing file!"); System.out.println("Program terminated."); System.exit(0); } }
已确认文件内容、拼写、顺序均正确,但无论是否添加文件,程序表现一致,推测是找不到文件导致空引用,但无法确定原因,希望无需修改代码解决问题。
分析与解决方案
1. NullPointerException的直接原因
报错发生在catch块的fileReader.close()(第100行):当FileNotFoundException触发时,fileReader = new Scanner(file)这行代码还未执行,fileReader仍为初始的null,此时调用close()必然抛出空指针异常。这是你看到的报错根源,而非文件找不到本身直接抛出空指针。
2. 文件找不到的核心原因(无需修改代码的解决方向)
你遇到的“找不到文件”问题,大概率是运行时的工作目录与程序期望的相对路径不匹配,常见场景及解决方法:
- 切换工作目录后运行:确认执行
java命令时的终端/命令行所在目录,是否与mainFile.class和目标文件所在目录一致。比如如果编译后的class文件在out/production/目录,你却在项目根目录运行命令,程序会在根目录找文件,而非class文件所在目录。解决方法:先通过cd命令切换到文件和class文件所在的目录,再执行java mainFile first_file.txt second_file.txt。 - 使用绝对路径作为参数:将命令行参数替换为文件的绝对路径(比如
java mainFile /home/user/project/first_file.txt /home/user/project/second_file.txt),绕开相对路径的解析问题。 - 检查文件名细节:确认文件名大小写(Linux/macOS区分大小写,Windows不区分),以及是否存在隐藏后缀(比如Windows下文件实际名为
first_file.txt.txt,但系统隐藏了.txt后缀导致你看错)。 - 正确指定类路径:如果程序使用了包结构,运行时需指定类路径。比如
mainFile在com.example包下,需用java -cp . com.example.mainFile first_file.txt second_file.txt命令运行,否则类加载路径错误会导致相对路径解析异常。
内容的提问来源于stack exchange,提问作者Samkayoki
相关产品推荐
相关产品推荐

