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";


  }
}

为什么这里没问题?为什么没有抛出异常?

4

4 回答 4

3

"Bermuda"是一个字符串字面量,String str = "Bermuda";暗示它str是一个新的字符串对象,其值为"Bermuda"

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

上面的行做同样的工作,但有一个区别,第一个字符串实例由管理,Java String constant pool第二个不是。

于 2013-01-12T10:32:27.417 回答
0

Exception不会抛出,因为您使用的是“静态”字符串,其内存是隐式创建的,并且引用分配给islands[i]

于 2013-01-12T10:32:52.263 回答
0

你没有做错任何事,编译器尊重这一点并且它也在运行。

当您使用静态字符串文字时,字符串对象是隐式创建的。你也可以用调试器试试这个,你的字符串“百慕大”有一个对象ID。

于 2013-01-12T10:36:33.297 回答
0

当您声明变量但未创建对象时,会发生您询问的异常。在“String [] island = new String[4]; ”行中,new 关键字用于实例化(或创建)一个 Integer 类型的对象,并将指针变量 island 分配给该对象。所以你不会得到例外。

于 2013-01-12T10:52:38.137 回答