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」は文字列リテラルであり、値が「Bermuda」の新しいStringオブジェクトであることをString str = "Bermuda";意味します。str

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

上記の行は同じ動作をしますが、1つの違いがありますが、最初の文字列インスタンスはによって管理されJava String constant pool、2番目の文字列インスタンスは管理されません。

于 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 [] islands = new String[4];」の行では、 new キーワードを使用して Integer 型のオブジェクトをインスタンス化 (または作成) し、ポインタ変数 islands にこのオブジェクトを割り当てています。したがって、例外は発生しません。

于 2013-01-12T10:52:38.137 に答える