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

JavaFX项目执行Act.loadAct方法报NullPointerException异常求助

问题排查与修复方案

核心空指针原因

你触发空指针的根本原因是Act类中的ArrayList<Scene> lists成员变量从未进行初始化,默认值为null,当执行this.lists.add(scenes)时直接调用了null对象的方法,所以抛出空指针异常。
你之前测试的是新建的Scene对象属性不为空,但完全没检查要添加的目标列表本身是不是null。

其他存在的bug

    1. loadAct方法中的循环变量i定义在读取文件的while循环之外,处理完第一行文本后i的值不会重置,后续行的角色列表会完全无法正确读取
    1. setList2静态方法的写法完全无效:Java是值传递,方法内对形参list重新赋值不会影响外部的实参this.lists
    1. 字符串拆分后未做去空格处理,你的文本格式是用-分隔,拆分后会残留多余空格,会导致后续展示时出现多余空白字符
    1. 带参的Act构造函数未对成员变量赋值,创建对象时传参也不会生效

修复代码

修正后的Act.java

package model;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class Act {
    String num;
    ArrayList<Scene> lists;

    // 修正带参构造
    Act(String num, ArrayList<Scene> list) {
        this.num = num;
        this.lists = list;
    }

    // 修正无参构造,初始化lists
    public Act() {
        this.lists = new ArrayList<>();
    }

    @SuppressWarnings("resource")
    public void loadAct(String file) throws IOException {
        BufferedReader br = null;
        br = new BufferedReader(new FileReader(file));
        String line;

        while ((line = br.readLine()) != null) {
            // 把i移到循环内,每行处理时重置为1
            int i = 1;
            String [] value = line.split(",");
            // 按" - "拆分,避免多余空格
            String [] tmp = value[0].split(" - ");
            this.num = tmp[0].trim();

            String name = null;
            if (tmp.length == 3) {
                name = tmp[1].trim();
            } else if (tmp.length ==4) {
                name = tmp[1].trim() + "-" + tmp[2].trim();
            }

            Role roleP = null;
            if (tmp.length == 3) {
                roleP = new Role(tmp[2].trim());
            } else if (tmp.length == 4) {
                roleP = new Role(tmp[3].trim());
            }

            ArrayList<Role> roles = new ArrayList<Role>();
            roles.add(roleP);

            while(i < value.length) {
                Role temp = new Role(value[i].trim());
                roles.add(temp);
                ++i;
            }

            Scene scenes = new Scene(tmp[0], name, roles);
            int j =0;
            while (j < scenes.list.size()) {
                System.out.println(scenes.id + scenes.title + scenes.list.get(j).name);
                ++j;
            }
            this.lists.add(scenes);
        }
    }
    // 补充getter方便后续拿数据展示
    public ArrayList<Scene> getLists() {
        return lists;
    }
}

可选优化:类名冲突提醒

你的自定义Scene类和JavaFX自带的javafx.scene.Scene类名完全一致,后续代码里很容易出现导包冲突,建议把自定义的场次类重命名为DramaScene避免后续混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:03