我对下面的代码感到有些困惑:
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";
}
}
为什么这里好吗? 为什么不抛出异常?
答案 0 :(得分:3)
“Bermuda”是字符串文字,String str = "Bermuda";
表示str
是一个新的String对象,其值为“Bermuda”。
String str = "Bermuda";
String str = new String("Bermuda");
上面的行做了同样的工作,但有一点不同,第一个字符串实例由Java String constant pool
管理,第二个字符串不是。{/ p>
答案 1 :(得分:0)
Exception
未被抛出,因为您使用的是“静态”字符串,其内存是隐式创建的,并且引用分配给islands[i]
答案 2 :(得分:0)
你没有做错任何事,编译器尊重它并且它也在运行。
当您使用静态字符串文字时,隐式创建字符串对象。 你也可以用调试器试试这个,你的String“Bermuda”有一个对象id。
答案 3 :(得分:0)
当您声明变量但未创建对象时,会出现您询问的异常。在“String [] islands = new String [4];”行中,new关键字用于实例化(或创建)Integer类型的对象,并为指针变量岛分配此对象。所以你不会得到例外。