我有下面這樣的代碼這是否會創建NullPointerException,如果不是,爲什麼不呢?
String name = null;
if (something)
name = someString;
if (name != null && name.equals("XYZ"))
doSomethingWith ("hello");
請問上述情況是否導致空指針異常,如果「東西」是假的線路? 如果不是爲什麼不呢?
我有下面這樣的代碼這是否會創建NullPointerException,如果不是,爲什麼不呢?
String name = null;
if (something)
name = someString;
if (name != null && name.equals("XYZ"))
doSomethingWith ("hello");
請問上述情況是否導致空指針異常,如果「東西」是假的線路? 如果不是爲什麼不呢?
不,它不會。如果name
是null
,那麼name.equals()
將不會被執行(因爲false && anything
仍然是false
)。順便說一句:如果左手邊的計算結果爲true
,則不檢查右手邊。
不,它不會。 & &操作的右側被執行只有& &運營商的左側是真實的。
同樣在的情況下。運營商,如果左手邊是真的,右手邊將不會被執行。
RHS =右手側,LHS =左手側。 – 2011-06-14 07:33:24
謝謝@Adriaan – 2011-06-14 08:15:53
不,它不會導致NullPointerException,因爲如何編寫if
語句。您有:從左至右
if (name != null && name.equals("XYZ")) {
//do stuff...
}
在if
語句中的條件進行評估。因此,如果name
爲空,則name != null
條件評估爲false
,並且由於false && <anything>
評估爲false
,所以name.equals("XYZ")
條件甚至不會被評估。
此行爲是一個runtime optimization,它避免執行不會影響if
語句結果的代碼,並且它恰好也會阻止您的示例代碼生成NullPointerException。
只是好奇,短路評估叫什麼?有沒有其他語言可以實現這種行爲,上述問題可能會導致NPE? – zengr 2011-06-14 05:01:37
維基百科說,「熱切的評價」(按照我給出的鏈接),但我從來沒有聽說過這個術語。我會說「貪婪」,因爲這是正則表達式中用來取最大匹配而不是最短匹配的術語。看起來像Fortran做到了,Pascal可以做到這一點。儘管Visual Basic變體似乎提供了_means_,但它們也不會短路。 – paxdiablo 2011-06-14 05:02:36
我曾見過他們稱之爲非短路操作員的情況:) – Vern 2011-06-14 05:12:06