2013-01-12 102 views
1

我對下面的代碼有些困惑:將字符串傳遞到字符串數組引用

class BooksTestDrive { 
    public static void main(String [] args) { 
     String [] islands = new String[4]; 

     islands[0] = "Bermuda"; 
     islands[1] = "Fiji"; 
     islands[2] = "Azores"; 
     islands[3] = "Cozumel"; 


    } 
} 

我的假設下,由於沒有對象初始化這會返回一個錯誤NullPointerException

我認爲我需要做

class BooksTestDrive { 
    public static void main(String [] args) { 
     String [] islands = new String[4]; 
     islands[0] = new String(); 

// etc.. 

     islands[0] = "Bermuda"; 
     islands[1] = "Fiji"; 
     islands[2] = "Azores"; 
     islands[3] = "Cozumel"; 


    } 
} 

爲什麼在這裏好嗎? 爲什麼不拋出異常?

回答

3

「百慕大」是一個字符串文字和String str = "Bermuda";意味着str與價值「百慕大」一個新的String對象。上述

String str = "Bermuda"; 
String str = new String("Bermuda"); 

的線做相同的工作,但有一個區別,第一串實例由Java String constant pool管理,第二個是沒有的。

+0

我明白了。所以,如果它可以讓我們說NotAStringClass [] islands = new NotAStringClass [4]; 然後傳遞一個字符串到島嶼[0]將無法正常工作? – Lion

+0

@Lion你看不到,對不起。 _islands [0] =「百慕大」; _和_islands [0] =新字符串(「百慕大」); _在功能上做同樣的事情,兩者都可以工作,但爲這兩個任務創建String對象,生活在內存中的不同位置。 – Juvanis

+0

明白了。你和哈桑的答案幫助我得到了答案。 謝謝:) – Lion

0

Exception沒有拋出,因爲使用的是「靜態」的,其回憶中隱式創建的字符串並分配給islands[i]

+0

我現在明白了。謝謝,你和Shekasteh幫助我理解它。 我只能選擇一個答案,所以我只會選擇他的,但謝謝你們兩個。 – Lion

+0

任何時間獅子!我很高興你能理解這個概念。 – hmatar

0

引用你沒有做錯什麼,這一點,它也運行編譯器榮譽。

當您使用靜態字符串文字時,字符串對象被創建爲隱式。 你也可以用調試器試試這個,你的String「Bermuda」有一個對象ID。

0

當您聲明變量但未創建對象時,您詢問的異常會發生。在「String [] islands = new String [4]」一行中,「new關鍵字用於實例化(或創建)Integer類型的對象,並且爲這個對象分配指針變量島。所以你不會得到一個例外。