2013-01-12 101 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类型的对象,并且为这个对象分配指针变量岛。所以你不会得到一个例外。