2016-06-08 83 views
-1

所以我做了一些关于Java中的NullPointerExceptions的解读,但我还没有完全理解它。(JAVA)空指针异常,我很困惑

这是为什么有效?

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; 
} 

像大多数人一样,我不喜欢找到一个意外的解决方案,但并不真正理解为什么它是一个解决方案。我对编程仍然很陌生,所以我试图理解实际发生的事情。当我给出一个隐喻用来比较时,我明白事情是最容易的,如果有人能以这种方式为我解释它,那真的会有所帮助> < ;;

非常感谢你们!

+0

什么是部门?第二,第二个代码片段不是相同的逻辑 – Li357

+0

那么如果你尝试调用未初始化的对象上的任何方法,它会抛出一个异常,以防止我们使用像部门!= null这样的检查,关于研究一些java中的逻辑运算符可能会有帮助 – Viney

+0

[Java逻辑运算符短路]可能重复(http://stackoverflow.com/questions/8759868/java-logical-operator-short-circuiting) – Nier

回答

1

的回答你的问题是在boolean algebra和你是如何实现的条件

这样做

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

相当于做

一个& C |一个&ç可以恢复到一个&(B | C) ....所以一个必须满足要么B或C以执行代码...

迄今为止很好。

第二条件

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

相当于做

A | B | C无法恢复/简化为任何东西

....所以一个必须满足OR要么B或C以执行代码...

如果A是空第一条件失败,那么Java尝试检查条件B,但由于B为null,爆炸很好空指针异常

0

由于布尔逻辑和运行时优化。

如果所有的操作数都是AND且一个句子是False,那么在布尔句中所有的句子都是False。因此,当运行时评估第一句并发现错误时,它不会评估其他句子和句子。与AND情况相比,没有NullPointerException异常,这意味着尝试访问空对象,如果先检查它,可能会发生。否则,如果句子包含OR或操作数,则运行时必须评估所有句子,因此空指针异常发生是因为对象为空,OR中的第一个句子是安全的,因为您可以将NULL对象与NULL比较,但第二个句子不,因为你不能访问空对象属性。