Intellij 说这可以是空指针。但是根据 javadoc

Intellij says that this can be a Null-Pointer. But according javadoc

  private boolean checkStatusAct(Contract contract) {
        if (contract.getActs() == null || contract.getActs().isEmpty()) {
            return true;
        } else if (contract.getActs() != null || (!contract.getActs().isEmpty())) { //here
            for (ContractAct contractAct : contract.getActs()) {
                if (contractAct.getStatusId() == 15) { 
                    return true;
                }
            }
        }
        return false;
    }

是不是逐个逐个检查,如果不为null (!= null || .isEmpty()) 就不会产生NullPoi

问题在于

contract.getActs() != null || (!contract.getActs().isEmpty())
如果 contract.getActs() returns 为 null,

将抛出 NullPointerException。在这种情况下,contract.getActs() != null 为假,并且由于 || 运算符,JVM 必须评估 contract.getActs().isEmpty(),这将抛出 NullPointerException。

要更正此问题,您应该写

contract.getActs() != null && (!contract.getActs().isEmpty())

但这实际上并不需要,因为您的第一个 if 条件已经处理了 contract.getActs()contract.getActs().isEmpty() 的情况。最好将您的代码重写为

    private boolean checkStatusAct(Contract contract) {
        if (contract.getActs() == null || contract.getActs().isEmpty()) {
            return true;
        } else {
            for (ContractAct contractAct : contract.getActs()) {
                if (contractAct.getStatusId() == 15) { 
                    return true;
                }
            }
        }
        return false;
    }

从Java8开始你也可以使用流(navnath的解决方案)。

在 Jav 8 或更高版本中。假设 contract.getActs() 是一个列表。你不需要写其他的:你可以像

private boolean checkStatusAct(Contract contract) {
    if (contract.getActs() == null || contract.getActs().isEmpty()) {
        return true;
    }
    return contract.getActs().stream().anyMatch(c -> c.getStatusId() == 15);
}