2012-09-26 61 views
2

取代&&在採訪我的記者問我:
什麼可以去錯的,如果你在下面的代碼與&替換& &:什麼可以去錯了,如果你和下面的代碼

String a=null; if (a!=null && a.length()>10) {...} 
+0

[是&,|,^按位運算符或邏輯運算符?(http://stackoverflow.com/questions/11597978/are-the-bitwise-operators-or-logical-operators) – Sam

+0

爲什麼不試試? – Shashi

+0

我已經回答了這個問題.. ;-) –

回答

15

&&是邏輯AND運算符(執行短路行爲,這意味着,如果所需要的第二個操作數僅被評估)

&是按位和鄰perator(按位&運算符執行按位AND操作)。

由於沒有短路的行爲,您將獲得NullPointerException

3

明白了:

單個這裏符號將導致NullPointerException。 由於& &是邏輯AND運算符,第二個操作數僅在需要時才被評估。

+0

這是真的,但只是說它是如此不是很有幫助。 –

2

當您使用& &它不會評估第二個表達式,如果第一個表達式爲false。 &另一方面會評估這兩個表達式無論如何。

在你的情況,如果你更換「& &」&這會讓NullPointedException

+0

任何人都可以解釋-1? – PermGenError

+0

可能是因爲你的回答與其他人一樣,10分鐘後。 –

1

&&&在表達式求值不同的優先級,並且在不()周圍鄰近的表達,你可能會得到在某些情況下有些「驚喜」。特別是,&&的優先級相當晚,所以除非要組合邏輯表達式混合的結果,否則通常不需要()。但&只是提前給你帶來的警惕。

&&是短路的,這意味着如果第一個表達式爲假,那麼第二個表達式根本就不被評估。 &不短路。在上面的例子中,這意味着與&&第二個表達式不會拋出NullPointerException - 通常是&&的一個重要特性。

與Java以外的類C語言相關:一旦你使它超過了上述兩個陷阱,就存在着操作實際執行的事情。如果兩個正在評估的表達式產生「布爾」結果,那麼這些值將被提升爲0x00或0x01,而運算符&&&將產生基本相同的答案。但是如果其中一個表達式不是布爾值,那麼你可能會最終將0x01和0x02進行邏輯與運算,併產生0x00,即使&&運算符的計算結果爲真。 (對Java沒有特別的問題,因爲它不允許&&的非布爾操作數,也不允許&混合的布爾/ int操作數。)

相關問題