Java 将字符串传递给字符串数组引用

Java 将字符串传递给字符串数组引用,java,object,nullpointerexception,Java,Object,Nullpointerexception,我对下面的代码有些困惑: 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"; } } 我假设

我对下面的代码有些困惑:

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


  }
}
为什么这里可以? 为什么不引发异常?

百慕大”是字符串文字,并且
String str=“百慕大”
表示
str
是一个值为“百慕大”的新字符串对象


上面的几行做了相同的工作,但有一点不同,第一个字符串实例由
Java字符串常量池管理,第二个不是。

异常不会引发,因为您使用的是“静态”字符串,其内存是隐式创建的,引用被分配给
孤岛[i]

您没有做错什么,编译器尊重这一点,并且它也在运行

使用静态字符串文字时,字符串对象是隐式创建的。
您也可以使用调试器尝试此操作,字符串“Bermuda”有一个对象id。

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

我明白了。因此,如果是这样的话,让我们假设NotAStringClass[]islands=newnotastringclass[4];那么将字符串传递到孤岛[0]将不起作用,对吗?@Lion您没有看到,抱歉。岛屿[0]=“百慕大”;岛屿[0]=新字符串(“百慕大”);在功能上做同样的事情,两者都会工作,但是为这两个赋值创建的字符串对象在内存中的不同位置。明白了。你的回答和哈桑的帮助我得到了。谢谢:)我现在明白了。谢谢,你和谢卡斯特帮我理解了。我只能选择一个答案,所以我会选择他的答案,但谢谢你们两位。随时都可以!我很高兴你理解了这个概念。
String str = "Bermuda";
String str = new String("Bermuda");