调用getResourceAsStream()方法出现Null pointer exception问题求助
问题根源
你遇到的NullPointerException触发自loader.setSource()执行逻辑,核心原因是classifier.class.getResourceAsStream("/"+filename)没有找到目标文件,返回了null,CSVLoader接收空输入源就会抛出空指针异常。
排查步骤
- 先验证文件是否真的能被类加载器找到:在
loader.setSource()前添加一行调试代码System.out.println(classifier.class.getResource("/" + filename));,如果控制台输出null即可确认是文件路径匹配失败的问题。 - 检查编译后的输出目录:普通Java项目编译后.class文件会生成在out/production/classes(IDEA默认路径)下,Maven/Gradle项目默认只会把
src/main/resources下的文件复制到类路径,放在src代码目录下的csv文件默认不会被复制到编译输出目录,运行时自然找不到。 - 核对路径写法:加前缀
/代表从类路径根目录开始查找,如果你的csv文件放在某一级包目录下,没有写全相对路径也会返回null。
解决方法
方法1(最推荐,符合Java项目规范)
把dataset.csv移动到项目的资源目录:
- 普通非构建工具Java项目:把文件放到编译输出的classes根目录下
- Maven/Gradle项目:把文件放到
src/main/resources目录下,构建工具会自动将该目录下的文件同步到类路径根目录,你现有的路径写法可以直接正常运行。
方法2(快速本地调试用)
改用本地文件流读取,不需要走类加载路径:
- 把
dataset.csv放在项目根目录(和src文件夹平级的位置) - 修改
getData方法中的加载代码,替换原有setSource行:
// 先导入java.io.FileInputStream包 loader.setSource(new FileInputStream(filename));
额外注意事项
你现有代码训练分类器的步骤有遗漏:加载完Instances数据集后需要手动指定分类标签的索引,否则后续训练J48模型时还会抛出异常,在loader.getDataSet()之后添加一行代码即可:
dataset.setClassIndex(dataset.numAttributes() - 1);
该行代码代表把数据集的最后一列作为分类标签。
内容的提问来源于stack exchange,提问作者Purohit Iyer
相关产品推荐
相关产品推荐

