Java/Kotlin中为未初始化对象设默认值?解决空指针异常
问题:未初始化对象时默认值失效导致空指针异常
我希望在用户未初始化对象时为其设置默认值,允许请求中不传入参数,但对象仍能拥有默认值。但目前遇到空指针异常,不清楚问题所在。
现有对象定义:
@Builder @Data @Valid @RequiredArgsConstructor @AllArgsConstructor @NoArgsConstructor(force = true, access = AccessLevel.PRIVATE) public class Request { private final List<Author> authors; private final Config config; private Params params; } @Builder @AllArgsConstructor @NoArgsConstructor(force = true, access = AccessLevel.PRIVATE) @Data @Setter(AccessLevel.NONE) public class Params { @Builder.Default private boolean adultOnly = false; }
使用构造器创建对象:
fun main(args: Array<String>) { val request = Request( authors, config( key, level ) ) }
使用Builder模式也会抛出空指针异常:
val request = QueriesRequest.builder() .userQueries(userQueries) .configurationKey( QueryConfigurationKey(configurationKey, granularityLevel)) .site(site).build() request.params.adultOnly // 抛出空指针异常,预期默认值是false }
问题原因
你遗漏了对Request类中params字段的默认实例初始化:
Params类的@Builder.Default仅对自身的Builder生效,只能保证构建Params对象时adultOnly有默认值false。- 但
Request类的params字段既没有初始化默认值,也没有通过@Builder.Default指定默认实例,所以构建Request时如果不传入params,该字段会保持null,访问request.params.adultOnly自然触发空指针异常。
解决方案
给Request类的params字段添加@Builder.Default注解并初始化默认实例:
@Builder @Data @Valid @RequiredArgsConstructor @AllArgsConstructor @NoArgsConstructor(force = true, access = AccessLevel.PRIVATE) public class Request { private final List<Author> authors; private final Config config; @Builder.Default private Params params = new Params(); }
修改后效果:
- 无论使用构造器还是Builder模式创建
Request对象,只要没有显式传入params,该字段都会自动初始化一个默认的Params实例。 - 结合
Params类中adultOnly的默认设置,此时访问request.params.adultOnly就能得到预期的false值,不会再触发空指针异常。
内容的提问来源于stack exchange,提问作者userit1985
相关产品推荐
相关产品推荐

