电话
400 9058 355
NullPointerException 总在运行时才报,因为 Java 仅在调用 null 引用的方法、访问其字段或数组长度时抛出,编译器不检查空值,JVM 也不提前拦截。
NullPointerException 总在运行时才报?因为 Java 只在真正调用一个为 null 的引用的方法、访问其字段,或进行数组长度读取等操作时,才会抛出 NullPointerException。编译器不检查引用是否为空,JVM 也不做提前拦截——它默认你“知道自己在做什么”。
常见触发点包括:
obj.toString() 中 obj == null
list.size() 中 list 是 null 而非空集合str.length() 中 str 是 null,不是 ""
Integer i = null; int j = i; → 拆箱触发 NPEObjects.requireNonNull 主动防御?它不是用来“捕获”异常的,而是把隐式 NPE 提前到明确位置,并附带可读提示。适合校验方法入参、构造函数参数、关键依赖注入点。
示例:
public UserService(UserDao userDao) {
this.userDao = Objects.requireNonNull(userDao, "userDao must not be null");
}
注意点:
NullPointerException,不是 IllegalArgumentException
if (obj == null) throw new NullPointerException(...)

不能。它只是把“是否为空”的判断显式化、强制化,但误用反而更易引发 NPE:
optional.get() 在空值时仍抛 NPEoptional.map(...).orElse(null) 把问题又藏回了 null
Optional,增加理解成本推荐场景只有两个:
findById(id))if (x != null)(如 user.getAddress().getCity() → user.flatMap(User::getAddress).map(Address::getCity))现代 IDE(IntelliJ / Eclipse)能基于静态分析标出潜在 NPE 路径,但前提是启用相关检查项并配合注解。
关键实践:
@Nullable / @NotNull(JetBrains 注解或 JSR-305),IDE 会据此推断@NonNull 会在生成的构造/Setter 方法中自动插入 Objects.requireNonNull
checkerframework 或 errorprone 插件,比运行时早几轮发现问题真正容易被忽略的是:团队协作中,很多人只看方法签名,不看 Javadoc 或注解含义,导致调用方仍传 null —— 这时候再强的工具也救不了设计层面的模糊契约。
邮箱:8955556@qq.com
Q Q:8955556
本文详解如何将Go官方present工具(用于生成HTML5...
PySNMP在不同版本中对SNMP错误状态(errorSta...
time.Sleep仅阻塞当前goroutine,其他gor...
PHPfopen()创建含特殊符号的文件名失败主因是操作系统...
WooCommerce中通过代码为分组产品动态聚合子商品的属...
io.ReadFull返回io.ErrUnexpectedE...
本文详解Yii2中控制器向视图传递ActiveRecord数...
本文详解为何通过wp_set_object_terms()为...
Pytest中使用@mock.patch类装饰器会导致补丁泄...
带缓冲的channel是并发安全的FIFO队列;make(c...