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

Java读取src文件夹文件报错:ClassLoader返回null致空指针异常

问题解决步骤

1. 修复类加载器空指针问题

你当前代码里的GetHangmanWords.class.getClass().getClassLoader()是错误写法:GetHangmanWords.class是当前类的Class对象,调用.getClass()会拿到Class<Class>的对象,它的类加载器是启动类加载器(Bootstrap ClassLoader),返回值为null,因此触发空指针异常。

正确的资源流获取方式有两种:

  • 用当前类的类加载器:GetHangmanWords.class.getClassLoader().getResourceAsStream("words.txt")
  • 直接用类对象的getResourceAsStream方法(更推荐,无需处理类加载器为null的情况):GetHangmanWords.class.getResourceAsStream("/words.txt")。注意路径前加/表示从类路径根目录查找;如果不加/,则从当前类所在包路径下查找。

2. 修复文件读取跳过行的问题

你当前的while循环逻辑会跳过一半内容:

while (reader.readLine() != null) {
    lines.add(reader.readLine());
}

每次循环调用两次readLine(),第一次用于判断非空,第二次才添加到集合,导致偶数行被跳过。正确写法是把读取的行存入变量:

String line;
while ((line = reader.readLine()) != null) {
    lines.add(line);
}

3. 修复数组转换类型错误

lines.toArray()返回的是Object[],直接强转String[]会抛出ClassCastException,正确方式是调用toArray(new String[0]),让集合返回指定类型的数组。

修复后的完整代码

GetHangmanWords.java

package hangman;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class GetHangmanWords {
    public static String[] get() throws IOException {
        // 从类路径根目录读取文件
        InputStream in = GetHangmanWords.class.getResourceAsStream("/words.txt");
        
        // 先判断流是否为空,避免后续操作空指针
        if (in == null) {
            throw new IOException("未找到文件words.txt");
        }
        
        // 使用try-with-resources自动关闭流,避免资源泄漏
        try (InputStreamReader inReader = new InputStreamReader(in);
             BufferedReader reader = new BufferedReader(inReader)) {
            
            ArrayList<String> lines = new ArrayList<>();
            String line;
            while ((line = reader.readLine()) != null) {
                lines.add(line);
            }
            
            return lines.toArray(new String[0]);
        }
    }
}

文件放置位置说明

确保words.txt放在类路径根目录:

  • 普通Java项目:直接放在src文件夹根目录(编译后会自动复制到bin目录根路径)
  • Maven/Gradle项目:放在src/main/resources文件夹下(编译后会复制到类路径根目录)

测试代码(可直接使用)

package hangman;

import java.io.IOException;

public class Test {
    public static void main (String [] args) throws IOException {
        String[] words = GetHangmanWords.get();
        // 打印结果验证
        for (String word : words) {
            System.out.println(word);
        }
    }
}

内容的提问来源于stack exchange,提问作者Dante_05

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 20:42:02