取代&&在採訪我的記者問我:
什麼可以去錯的,如果你在下面的代碼與&替換& &:什麼可以去錯了,如果你和下面的代碼
String a=null; if (a!=null && a.length()>10) {...}
取代&&在採訪我的記者問我:
什麼可以去錯的,如果你在下面的代碼與&替換& &:什麼可以去錯了,如果你和下面的代碼
String a=null; if (a!=null && a.length()>10) {...}
&&
是邏輯AND運算符(執行短路行爲,這意味着,如果所需要的第二個操作數僅被評估)
&
是按位和鄰perator(按位&運算符執行按位AND操作)。
由於沒有短路的行爲,您將獲得NullPointerException
。
明白了:
單個這裏符號將導致NullPointerException
。 由於& &是邏輯AND運算符,第二個操作數僅在需要時才被評估。
這是真的,但只是說它是如此不是很有幫助。 –
一個NullPointerException
將被拋出,因爲沒有短路時&
使用,這意味着右側操作數是總是評估,即使左手操作的結果是false
。當使用&&
時,如果左側操作數是true
,右側操作數的計算結果僅爲。
Java語言規範中的部分15.22.2. Boolean Logical Operators &, ^, and |和15.23. Conditional-And Operator &&描述了這種行爲。
當您使用& &它不會評估第二個表達式,如果第一個表達式爲false。 &另一方面會評估這兩個表達式無論如何。
在你的情況,如果你更換「& &」與&這會讓NullPointedException
任何人都可以解釋-1? – PermGenError
可能是因爲你的回答與其他人一樣,10分鐘後。 –
&
和&&
在表達式求值不同的優先級,並且在不()
周圍鄰近的表達,你可能會得到在某些情況下有些「驚喜」。特別是,&&
的優先級相當晚,所以除非要組合邏輯表達式混合的結果,否則通常不需要()
。但&
只是提前給你帶來的警惕。
&&
是短路的,這意味着如果第一個表達式爲假,那麼第二個表達式根本就不被評估。 &
不短路。在上面的例子中,這意味着與&&
第二個表達式不會拋出NullPointerException - 通常是&&
的一個重要特性。
與Java以外的類C語言相關:一旦你使它超過了上述兩個陷阱,就存在着操作實際執行的事情。如果兩個正在評估的表達式產生「布爾」結果,那麼這些值將被提升爲0x00或0x01,而運算符&
和&&
將產生基本相同的答案。但是如果其中一個表達式不是布爾值,那麼你可能會最終將0x01和0x02進行邏輯與運算,併產生0x00,即使&&
運算符的計算結果爲真。 (對Java沒有特別的問題,因爲它不允許&&
的非布爾操作數,也不允許&
混合的布爾/ int操作數。)
[是&,|,^按位運算符或邏輯運算符?(http://stackoverflow.com/questions/11597978/are-the-bitwise-operators-or-logical-operators) – Sam
爲什麼不試試? – Shashi
我已經回答了這個問題.. ;-) –