【发布时间】:2018-01-23 21:28:40
【问题描述】:
为什么使用辅助变量进行空值检查可以防止NullPointerException,而直接空值检查则不行?
考虑这两个代码块:
public boolean passwordMatch1(Player player, String password) {
if (LoggedPlayer.getLoggedPlayer(player) != null) {
return LoggedPlayer.getLoggedPlayer(player).getPassword().equals(password);
}
return false;
}
和
public boolean passwordMatch2(Player player, String password) {
LoggedPlayer p = LoggedPlayer.getLoggedPlayer(player);
if (p != null) {
return p.getPassword().equals(password);
}
return false;
}
他们做的完全一样,方法passwordMatch2使用LoggedPlayer的辅助变量p,而方法passwordMatch1直接检查null。
已知方法 LoggedPlayer.getLoggedPlayer(Player player) 在找不到合适的 LoggedPlayer 实例时返回 null。
IDEA 在passwordMatch1 中报告警告:
方法调用“getPassword”可能会产生 'java.lang.NullPointerException
而passwordMatch2 没有警告。
(IntelliJ IDEA Ultimate 2017.2)
【问题讨论】:
-
如果底层
LoggedPlayer.getLoggedPlayer()数据结构能够在调用之间进行更改(例如在多线程上下文中),那么passwordMatch1中的第二次调用可能会返回空值。
标签: java intellij-idea nullpointerexception