2017-08-07 50 views
-2

以下代碼是否可以在任何情況下拋出NullPointerException?任何空指針異常的機會?

比方說我們有功能myClass類的testFunction,聲明一個變量並返回它沒有先對其進行初始化:

public static String testFunction() 
{ 
    String s1 
    return s1 
} 

,然後我們有下面的代碼返回值進行比較的字符串:

String myString = myClass.testFunction(); 

if(myString == "test") 
{ 
system.out.println("Print A") 
} 
else 
{ 
system.out.println("Print B") 
} 

我認爲這將總是打印「打印B」,除非函數實際返回的「測試」,然後將打印「打印A」。這是正確的嗎?

+1

在java中有一些';'在每個命令的末尾...... – azro

+0

@pzaenger在這種情況下它肯定會拋出一個NPE ...... –

+3

你可以安全地嘗試它,既不java也不會破壞計算機。 –

回答

2

不,如你所寫,它不能產生NPE(出於多種原因)。

public static String testFunction() 
{ 
    String s1; 
    return s1; 
} 

這將導致編譯器錯誤,因爲s1尚未初始化。我在您的代碼示例中添加了分號以使其在語法上有效。

if(myString == "test") 

這不會產生NPE。但是,它並不是比較字符串是否平等的正確方法。查看兩個字符串對象是否是相同字符序列的正確方法是firstString.equals(secondString),如果firstString爲空,則可以生成NPE。

當比較字面來,可能是空的變量的字符串,一個常見的成語是把字符串字面第一,因爲它是一種已知的非空的對象,像這樣:

"test".equals(myString); 

這將從不生產NPE。

+0

感謝您和所有參與答案的人,並感謝您提供非常詳細的答案。 – Jones5672

+0

此外,一方面的問題,只是爲了我自己的知識。在上面的例子中,如果(myString ==「test」),即使myString爲null,它仍然不會導致空指針異常? – Jones5672

+0

是的,這是正確的。與對象一起使用的'=='操作符比較對象的質量,或多或少的意思,「這些都是指向同一對象的指針嗎?」這是平等和相同的區別。如果我有一隻黃色橡皮鴨,並且你有相同型號的黃色橡皮鴨,我們的鴨子就相當於('myDuck.equals(yourDuck)'),但它們不一樣('myDuck!= yourDuck')。 –