2012-08-23 168 views
3

這些比較是否始終安全無法創建NullPointer異常?這是一個很好的IF塊嗎?

if(myObject == null || myObject.someMethod() == someValue) 
{ 
    if(myObject == null && myObject.getAlwaysTrue()) 
     { 

     } 
} 

除了短路之外,java是否還有條件評估方向優先?

更新:我知道myObject.anything()會拋出一個NullPointer。這只是因爲我遇到了其他程序員的代碼,我想知道是否有一種安全的方法可以在單個條件下將多個檢查與空檢查一起執行。我正在尋找一條堅持的好規則。

+3

優先順序,總是從左到右(除非你有括號內的東西)。 – kosa

+0

使用IDE進行研究。更好的人會爲你標記這種不安全的代碼。 – dnault

回答

6

沒有,這條線是不是安全:

if(myObject == null && myObject.getAlwaysTrue()) 

如果你知道myObject爲空,那麼你不應該試圖取消對它的引用。但是,如果你寫這個:

if(myObject != null && myObject.getAlwaysTrue()) 

然後它會是安全的。這是因爲&&(和||就此而言)具有short-circuit evaluation。如果您編寫a && b且表達式a的計算結果爲false,則表達式b未被計算,因此它不會引發異常。左操作數總是首先被評估。

+0

感謝您的回覆。這種模式:左邊有'!= null',剩下的'&&'檢查左邊的'== null'和其餘的'||'檢查。但是這對混合'&&'和'||'不起作用。 –

0

這不是:

if(myObject == null && myObject.getAlwaysTrue()) 

&&將檢查這兩個條件,myObject.getAlwaysTrue()將引發NullPointerException異常,如果myObject的是空。

+0

您可能想解釋爲什麼;) – MadProgrammer

+2

NullPointerException! :) –

+1

你我可以看到,但從帖子中可以明顯看出,OP並沒有 – MadProgrammer

2
if(myObject == null && myObject.getAlwaysTrue()) 

這將導致你NullPointerExceptionmyObjectnull

3

爲什麼不分離出的門控問題?

if (myObject != null) { 
    if ((myObject.someMethod() == someValue) && myObject.getAlwaysTrue()) { 

    } 
} 
+0

+1件事情真的很簡單,但我們只是避免去思考最好 –

+1

@Nandkumar如果不是很簡單,我一小時後就不明白了;) –

+1

@wingman - '傻瓜證明' – KevinDTimm

1

如果myObjectnullmyObject.getAlwaysTrue()在第二if語句總是導致NullPointerException

||的情況下,if表達式計算布爾表達式,直到找到第一個爲true的布爾表達式。

隨着&&if表達式計算布爾表達式,直到它找到第一個是false

所以你的情況時myObjectnull,你會得到如下的評估:

首先if

myObject == null -> true 

if

myObject == null -> true 
myObject.getAlwaysTrue() -> NullPointerException 
1

只要我能,我努力減少壓力和複雜的「ifology」。在你的情況下,我只寫

if (myObject == null) return; 
... go on knowing that myObject is not null... 
+0

這就是目標。 –

相關問題