(JAVA)空指针异常,I';我很困惑

(JAVA)空指针异常,I';我很困惑,java,nullpointerexception,Java,Nullpointerexception,因此,我已经阅读了一些关于Java中NullPointerException的阅读资料,但我仍然没有完全理解它 为什么这样做有效 if ((department != null && department.equals("COMP")) || (department != null && department.equals("COMM"))) { this.department = department; } 另一个有效的方法是我第一次检查!=null,

因此,我已经阅读了一些关于Java中NullPointerException的阅读资料,但我仍然没有完全理解它

为什么这样做有效

if ((department != null && department.equals("COMP")) || (department != null && department.equals("COMM")))
{
    this.department = department;
}
另一个有效的方法是我第一次检查!=null,然后执行第二个嵌套if语句,然后检查“COMP”或“COMM”

与上面的相比,这个怎么不起作用

if (department != null || department.equals("COMP")) || department.equals("COMM")))
{
    this.department = department;
}

和大多数人一样,我不喜欢偶然发现一个解决方案,但不真正理解为什么它是一个解决方案。我对编程还是很陌生,所以我试图了解引擎盖下到底发生了什么。当给我一个比喻来比较时,我最容易理解事情,如果有人能用这种方式来解释它,那将非常有帮助>,因为布尔逻辑和运行时优化


在布尔语句中,如果所有操作数都是AND,且一个语句为False,则所有语句都为False。因此,当运行时评估第一个句子并发现它是假的时,它不会评估其他句子和句子。对于和case,没有NullPointerExceptions异常,这意味着如果您首先检查它,可能会尝试访问null对象。否则,如果语句仅包含或操作数,则运行时必须计算所有语句,因此会发生空指针异常,因为对象为Null,或中的第一句是安全的,因为您可以将Null对象与Null进行比较,但第二句不是,因为您无法访问Null对象属性

您的问题的答案在中,以及您是如何实施这些条件的

这样做

((department != null && department.equals("COMP")) || (department != null && department.equals("COMM")))
等于做

A&B|A&C可以恢复到A&B|C。。。。因此,要执行代码,必须满足AB或C

到目前为止还不错

第二个条件

if (department != null || department.equals("COMP")) || department.equals("COMM")))
等于做

A | B | C无法恢复/简化为任何内容

。。。。因此,要执行代码,必须满足AB或C


如果一个为null的第一个条件失败,那么java会尝试检查条件B,但由于B为null,它会爆发一个漂亮的空指针异常

什么是部门?第二,第二个代码段的逻辑性不一样,如果您试图对未初始化的对象调用任何方法,它会抛出一个异常,以防止我们使用类似department的检查null,关于这个问题,在java中学习一点逻辑运算符可能会有所帮助。@Nier的可能重复我不认为这正是OP的问题。OP误解了两个if语句之间的布尔代数(尽管我确信肯定存在重复)。