在 Java 中,**空指针异常(NullPointerException,NPE)**是最常见的运行时异常之一。避免空指针,核心思路是:不让变量为 null,或在使用前确认不为 null。下面从「编码习惯、语法特性、工具与框架」几个层面系统说明。
List<String> list = new ArrayList<>();
// 而不是
List<String> list = null;
用“空对象”代替 null:
// 不推荐
public List<User> getUsers() {
return null;
}
// 推荐
public List<User> getUsers() {
return Collections.emptyList();
}
if (user != null && user.getName() != null) {
System.out.println(user.getName());
}
Optional 明确表达“可能为空”。
Optional<User> userOpt = getUser();
userOpt.ifPresent(u -> System.out.println(u.getName()));
避免这样用(反而更复杂):
if (userOpt.isPresent()) {
User u = userOpt.get(); // 不如 ifPresent
}
链式安全获取:
String name = Optional.ofNullable(user)
.map(User::getName)
.orElse("未知");
Objects.requireNonNull在方法参数入口尽早失败:
public void setUser(User user) {
this.user = Objects.requireNonNull(user, "user 不能为 null");
}
String.isEmpty() 替代 == nullif (str != null && !str.isEmpty()) { }
Java 11+:
if (str != null && !str.isBlank()) { }
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public void process(@NotNull User user) { }
配合 IDE(IntelliJ IDEA)可编译前提示 NPE 风险。
@NonNull
private String name;
自动生成 null 检查。
if (list != null && !list.isEmpty()) { }
工具类推荐:
CollectionUtils.isEmpty(list)(Apache / Spring)MapUtils、StringUtilsnull 作为数组元素String[] arr = new String[3];
// arr[0] 默认就是 null
遍历时:
for (String s : arr) {
if (s != null) { }
}
interface Logger {
void log(String msg);
}
class NullLogger implements Logger {
public void log(String msg) { }
}
不要在深层代码中才发现 null,应在入口校验。
能不返回 null 就不返回,返回了就用 Optional 或判空,调用前确认安全。
如果你愿意,我可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。