2016-06-08 103 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比較,但第二個句子不,因爲你不能訪問空對象屬性。