You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. 文件找不到是核心错误:代码里用的是相对路径3LetterWords.txt,NetBeans运行Java程序时默认的工作目录是项目根目录,不是源码所在目录,程序在对应路径下找不到目标文件,所以FileReader初始化直接失败。
  2. 空指针是连锁错误:因为文件打开失败,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 02:57:21