为什么IDEA报告可能的NullPointerException?

Már*_*ner 1 java intellij-idea nullpointerexception

为什么使用辅助变量进行空检查以防止 NullPointerException,而直接空值检查不是?


考虑这两个代码块:

public boolean passwordMatch1(Player player, String password) {
    if (LoggedPlayer.getLoggedPlayer(player) != null) {
        return LoggedPlayer.getLoggedPlayer(player).getPassword().equals(password);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

public boolean passwordMatch2(Player player, String password) {
    LoggedPlayer p = LoggedPlayer.getLoggedPlayer(player);
    if (p != null) {
        return p.getPassword().equals(password);
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

它们做的完全一样,方法passwordMatch2使用LoggedPlayer被调用的辅助变量p,而方法passwordMatch1是直接检查null.

LoggedPlayer.getLoggedPlayer(Player player)已知方法null在没有LoggedPlayer找到适当的实例时返回.


IDEA正在报告以下警告passwordMatch1:

方法调用'getPassword'可能会产生'java.lang.NullPointerException

虽然passwordMatch2没有警告.

(IntelliJ IDEA Ultimate 2017.2)

Nic*_*ick 7

考虑一个可能(但很糟糕)的实现LoggedPlayer.getLoggedPlayer.

public static LoggedPlayer getLoggedPlayer(Player player) {
   return Math.random() < 0.500 ? new LoggedPlayer() : null;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,getLoggedPlayer可能不是纯粹的,并且它的单独调用可能返回不同的值.