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
相关产品推荐
相关产品推荐

