Java读取txt存入ArrayList时报文件找不到与空指针异常问题
文件读取功能报错排查
现有实现代码
public static void main(String[] args) { List <String> words = new ArrayList <String>(); BufferedReader br = null; try { br = new BufferedReader(new FileReader("3LetterWords.txt")); String word; while ((word = br.readLine()) != null ){ words.add(word); } } catch (IOException e) { e.printStackTrace(); } finally { try { br.close(); } catch (IOException ex) { ex.printStackTrace(); } } String [] wordList = new String[words.size()]; words.toArray(wordList); List<String> combinations = display(new ArrayList<>()); } public static List<String> display(ArrayList<String> combinations) { int counter = 1; for (char c1 = 'a'; c1 <= 'z'; c1++) { for (char c2 = 'a'; c2 <= 'z'; c2++) { for (char c3 = 'a'; c3 <= 'z'; c3++) { String combo = "" + c1 + c2 + c3; combinations.add(combo); System.out.println("" + counter++ + " " + c1 + c2 + c3); } } } return combinations; }
实现目标
- 读取存储三字母单词的
.txt文件,将内容存入ArrayList,无需提前指定文件大小 - 通过
BufferedReader建立文件读取通道,逐行读取内容直到文件结束标识,逐行存入集合 - 捕获IO异常,读取完成后关闭文件流
- 最终将
ArrayList转换为数组,后续结合生成的三字母组合集合,实现排序、搜索相关逻辑
运行报错信息
java.io.FileNotFoundException: 3LetterWords.txt (No such file or directory) at java.base/java.io.FileInputStream.open0(Native Method) at java.base/java.io.FileInputStream.open(FileInputStream.java:216) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157) at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111) at java.base/java.io.FileReader.<init>(FileReader.java:60) at wordleproj.WordleProj.main(WordleProj.java:17) Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.io.BufferedReader.close()" because "br" is null at wordleproj.WordleProj.main(WordleProj.java:26) /Users/mac/Library/Caches/NetBeans/12.6/executor-snippets/run.xml:111: The following error occurred while executing this line: /Users/mac/Library/Caches/NetBeans/12.6/executor-snippets/run.xml:68: Java returned: 1
错误原因
- 文件找不到是核心错误:代码里用的是相对路径
3LetterWords.txt,NetBeans运行Java程序时默认的工作目录是项目根目录,不是源码所在目录,程序在对应路径下找不到目标文件,所以FileReader初始化直接失败。 - 空指针是连锁错误:因为文件打开失败,
br对象从始至终没有被成功赋值,一直是初始值null,走到finally块时直接调用br.close(),空对象调用方法就触发了空指针异常。
修复方案
- 解决路径匹配问题:
先在main方法开头加一行System.out.println(System.getProperty("user.dir"));运行,控制台打印的路径就是NetBeans当前的工作目录,把3LetterWords.txt放到这个目录下即可;也可以直接填写文件的绝对路径(比如/Users/mac/WordleProj/3LetterWords.txt),彻底避免相对路径匹配错误。 - 修复空指针风险:
原写法在finally块关闭流前没有判空,只要流初始化失败就会触发空指针。推荐直接用Java 7及以上版本支持的try-with-resources语法,资源会在代码块执行结束后自动关闭,不需要手写finally关闭逻辑,从根源避免空指针和流泄漏问题。
修复后的文件读取代码示例:
public static void main(String[] args) { List <String> words = new ArrayList <String>(); // try-with-resources 写法,自动关闭流 try (BufferedReader br = new BufferedReader(new FileReader("3LetterWords.txt"))) { String word; while ((word = br.readLine()) != null ){ words.add(word); } } catch (IOException e) { e.printStackTrace(); } String [] wordList = new String[words.size()]; words.toArray(wordList); List<String> combinations = display(new ArrayList<>()); }
如果坚持用原有的finally写法,必须在关闭流前加非空判断:
finally { try { if (br != null) { // 增加非空校验 br.close(); } } catch (IOException ex) { ex.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者creativethoughts
相关产品推荐
相关产品推荐

