应主动防范 nullpointerexception:入口参数用 objects.requirenonnull 校验,可选结果返回 optional,字符串集合判空需先防 null,配合 @nonnull/@nullable 注解与工具链提前预警。

NullPointerException 不该靠 try-catch 捕获来“处理”,而应在编码阶段主动防范——让 null 在源头就暴露、在调用前就被拦截、在语义中就被明确。
入口参数必须设防
方法或构造器接收的关键对象,一旦为 null,后续多处解引用就会连锁崩塌。用 Objects.requireNonNull() 替代手写 if 判空,异常信息更准、堆栈指向调用方而非深层。
- 构造函数里校验依赖: this.repo = Objects.requireNonNull(repo, "repo must not be null");
- public 方法开头校验入参: Objects.requireNonNull(id, "id cannot be null");
- 不用于私有逻辑或高频循环内;它不是业务校验,而是契约声明
返回值要表达“可选性”
当方法天然可能查不到结果(如 findById、getConfig、parseJson),返回 Optional
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 正确: public Optional
findUserById(Long id) { ... } - 错误: public Optional
- > listUsers() → 嵌套 Optional 是反模式
- 禁止将 Optional 用作字段、参数或集合元素;也别裸调 optional.get()
字符串和集合别信“看起来安全”
str.isEmpty() 或 list.size() 本身就会 NPE——前提是 str 或 list 为 null。这类误判是高频根源。
- 字符串判空统一用:str == null || str.isBlank()(Java 11+),或 StringUtils.isNotBlank(str)(兼容旧版)
- 集合字段声明即初始化:private List
- items = new ArrayList();
- 对外返回集合时,用 Collections.unmodifiableList(items) 或 ImmutableList.copyOf(items),防传入 null 或被篡改
用注解+工具提前标红风险
@NonNull 和 @Nullable 不是装饰,配合 IntelliJ/Eclipse 和 SpotBugs/NullAway,能在写代码时就把潜在空值路径标出来。
- 接口方法返回不确定是否为空,就加 @Nullable
- 参数、字段、返回值标注保持一致;未标注默认视为不可为空
- Lombok 的 @RequiredArgsConstructor(onConstructor_ = {@NonNull}) 可自动生成非空校验代码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










