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

Builder模式代码运行抛出NullPointerException问题求助

问题原因

你遇到的空指针异常,是因为EngineBuilder类里的e字段初始为null,而你在获取builder实例后,没有先调用builder()方法初始化Engine对象,直接调用setName时就会访问null的e,导致报错。

异常信息翻译:

线程"main"中的异常:java.lang.NullPointerException: 无法调用"Engine.setName(String)",因为"this.e"为null

修复方案

方案一(推荐,符合Builder模式常规写法)

修改EngineBuilder的构造方法,在创建Builder实例时就初始化Engine对象,同时删掉多余的builder()方法:

public class Engine{

    private String name = null;
    private Mercedes m = null;

    private Engine() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Mercedes getM() {
        return m;
    }

    public void setM(Mercedes m) {
        this.m = m;
    }

    public static EngineBuilder builder() {
        return new EngineBuilder();
    }

    public static class EngineBuilder {
        private Engine e;

        // 构造时直接初始化Engine
        private EngineBuilder() {
            e = new Engine();
        }

        public Engine build() {
            return this.e;
        }

        public EngineBuilder setName(String name) {
            this.e.setName(name);
            return this;
        }

        public EngineBuilder setM(Mercedes m) {
            this.e.setM(m);
            return this;
        }

    }
    public static void main(String[] args) {
        EngineBuilder builder = Engine.builder();
        builder.setName("test");
                
        Engine e = builder.build();
        System.out.println(e.getName()); // 输出test
    }
}

方案二(不推荐,仅临时修复)

如果不想修改Builder结构,就在main方法里先调用builder()方法初始化e,再调用设置方法:

public static void main(String[] args) {
    EngineBuilder builder = Engine.builder().builder();
    builder.setName("test");
            
    Engine e = builder.build();
}
说明

方案一更合理,因为Builder模式的设计初衷就是让调用者拿到Builder实例后,直接链式调用设置方法,不需要额外手动初始化目标对象。通过私有构造方法初始化Engine,还能保证Engine只能通过Builder创建,符合封装原则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:40:24