java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

配列の初期化の方法をまとめました

投稿日:

最終更新日:2022年03月05日

アイキャッチ

こんにちは。今回の記事はJavaの配列についての、基本的な内容の記事です。配列では複数の値をひとまとめに扱うことが出来ます。例えば、N回の試験の点数をまとめて扱いたいという場合、int型変数をひとつひとつ用意するより、int型の配列をひとつ用意する方が楽です。

配列を使う場合、初期化の方法を知っておくと便利だと思います。この記事では配列の初期化の方法をまとめました。

宣言だけの場合

最初に配列の宣言について、動作確認をしました。以下は配列の宣言だけして、println()メソッドに指定しただけのプログラムです。

コンパイルエラーになる例

public class Test001 {

	public static void main(String[] args) {
		// (1)
		int[] points;
		// (2)
		System.out.println(points);
	}

}

エラー内容

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	ローカル変数 points が初期化されていない可能性があります

(1)では配列の宣言だけをしています。この時点では初期化はされていません。

(2)では、変数pointsをprintln()メソッドの引数に指定しています。Eclipseではpointsのところに赤の波線が表示されます。マウスポインタを合わせると、以下のメッセージが表示されます。

  • ローカル変数 points が初期化されていない可能性があります

上記のように配列は宣言時に初期化するか、どこかの処理で値を設定する必要があります。

newを使う

配列宣言の変数に代入する形で、「new 型[サイズ]」という記述をすることで、配列を初期化することが出来ます。

newで初期化する例

import java.util.Arrays;

public class Test002 {

	public static void main(String[] args) {
		Test002 t = new Test002();
		t.test1();
		System.out.println("-----------------");
		t.test2();
	}

	private void test1() {
		System.out.println("サイズが3の配列で初期化");
		// (1)
		int[] points = new int[3];
		// (2)
		System.out.println("配列のサイズ:" + points.length);
		// (3)
		System.out.println("配列の内容:" + Arrays.toString(points));
	}

	private void test2() {
		System.out.println("サイズ0の配列で初期化");
		// (4)
		int[] points = new int[0];
		System.out.println("配列のサイズ:" + points.length);
		System.out.println("配列の内容:" + Arrays.toString(points));
	}

}

結果

サイズが3の配列で初期化
配列のサイズ:3
配列の内容:[0, 0, 0]
-----------------
サイズ0の配列で初期化
配列のサイズ:0
配列の内容:[]

(1)ではnewを使ってサイズが3の配列を生成しています。

(2)ではその配列のサイズを出力しています。[配列の変数].lengthでその配列の長さが取得できます。

(3)ではArraysクラスのtoString()メソッドを使って、配列の内容を出力しています。このメソッドは引数に指定された配列の内容をカンマ区切りで出力してくれます。

(3)の出力内容を見ると、全ての要素が0であることがわかります。このプログラムの場合、int型の配列を宣言しているので、各要素にint型の初期値である値0が格納されます。newを使った配列の初期化の場合、配列の各要素は型に対応する初期値で初期化されます。

(4)ではサイズが0の配列を生成しています。そのため、points.lengthの値が0です。

サイズ指定の値について

newを使った初期化では、配列のサイズにint型変数を使うことが出来ます。ただし、値の範囲は0以上にする場合があります。

以下の例では配列の初期化でサイズ指定に変数を使っています。

サイズ指定に変数を使用する例

import java.util.Arrays;

public class Test003 {

	public static void main(String[] args) {
		Test003 t = new Test003();

		// 正の数を指定
		t.test1(4);

		System.out.println("-------------------------");

		// 0を指定
		t.test1(0);

		System.out.println("-------------------------");

		// 負の数を指定
		t.test1(-1);
	}

	private void test1(int size) {
		System.out.println("size: " + size);

		// (1)
		int[] points = new int[size];
		for (int i = 0; i < size; i++) {
			points[i] = i;
		}

		// (2)
		System.out.println("配列のサイズ:" + points.length);
		// (3)
		System.out.println("配列の内容:" + Arrays.toString(points));
		// (4)
		System.out.flush();
	}

}

結果

size: 4
配列のサイズ:4
配列の内容:[0, 1, 2, 3]
-------------------------
size: 0
配列のサイズ:0
配列の内容:[]
-------------------------
size: -1
Exception in thread "main" java.lang.NegativeArraySizeException: -1

上記サンプルではtest1()メソッドを定義しています。

(1)ではそれを配列のサイズ指定に仮引数を記述しています。その後、for文で各要素に0から順番に整数を格納しています。(2)では配列のサイズを出力しています。(3)では配列の内容を出力しています。

(4)ではコンソールの出力を調節するために、flush()メソッドを呼び出すことで、バッファを出力するようにしています。flush()メソッドを使わない場合、標準出力とエラー出力の順序が揃いませんでした。

上記結果のように、test(-1)が実行されると、エラーメッセージが出力されます。配列のサイズ指定に-1が設定されるため、上記エラーが出力されます。newを使った配列の初期化では、サイズの指定に正の整数が設定されるよう注意する必要があります。

イニシャライザーを使う

配列のイニシャライザー(array initializer)という仕様があります。波括弧で値を並べる書き方です。

ソース

import java.util.Arrays;

public class Test004 {

	public static void main(String[] args) {
		Test004 t = new Test004();

		t.init1();

		System.out.println("-------------------------");

		t.init2();
	}

	private void init1() {
		// (1)
		int[] points = {11, 12, 13};
		System.out.println("配列のサイズ:" + points.length);
		System.out.println("配列の内容:" + Arrays.toString(points));
	}

	private void init2() {
		// (2)
		int[] points = new int[]{21, 22, 23, 24};
		System.out.println("配列のサイズ:" + points.length);
		System.out.println("配列の内容:" + Arrays.toString(points));
	}

}

結果

配列のサイズ:3
配列の内容:[11, 12, 13]
配列のサイズ:4
配列の内容:[21, 22, 23, 24]

(1)ではint型配列pointsを宣言して、3つの値で初期化しています。波括弧で値を並べた記述は、Eclipseによると配列定数と呼ばれるようです。

(2)では配列定数の先頭に型宣言を記述しています。(1)の書き方でも左辺によって型が明確になっているため、(2)の書き方はしなくてよいと思いました。

ただし、(1)の配列定数は変数定義と同じ行でのみ使うことが出来ます。以下のような書き方はコンパイルエラーが発生します。

エラーになる例

// コンパイルエラーになる。
int[] points;
points = {21, 22, 23, 24};

結果

Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
	配列定数はイニシャライザーにおいてのみ使用可能です

Eclipseを使っている場合、配列定数の個所に赤の下線が表示されます。上記のように、配列定数は配列の変数宣言の右辺で使用が可能です。

nullで初期化する

Javaの配列はnullで初期化することが可能です。ただし、その状態でドットによる参照をされるとエラーになります。

エラーになる例

public class Test005 {

	public static void main(String[] args) {
		// (1)
		int[] points = null;
		// (2)
		System.out.println(points.length);
	}

}

結果

Exception in thread "main" java.lang.NullPointerException: Cannot read the array length because "points" is null

上記はpoints.lengthの個所でエラーが発生しています。(1)でpointsをnullで初期化していますが、その状態のまま(2)でドットによる参照が実行されているためです。

以上、参考になれば幸いです。