こんにちは。ECF Techブログ
担当 Michiharu.Tです。
Javaプログラミング入門記事の第5章をお送りいたします。
第5章のテーマは「配列」です。
今回は2部構成のうちのPart2となります。
本連載の初回および章立ての一覧については下記のリンクから確認できます。
解説動画
2023/12/29 解説動画を掲載しました。
5-5 null
参照型変数特有の値にnull(ヌルやナルと読む)があります。nullは参照型変数に代入できる値の1つで「何もない・空」を意味する値です。int[] array = null
のように参照型変数にnullを代入すると、その変数は何も指し示していない状態となります。
5-5-1 nullと実行時エラー
nullの扱いには注意が必要です。下のプログラムでは、nullに関連する実行時エラーが発生します。
プログラム例
public class Main { public static void main(String[] args) { int[] array = null; array[2] = 10; } }
実行結果
Exception in thread "main" java.lang.NullPointerException: Cannot store to int array because "<local1>" is null at Main.main(Main.java:4)
解説
int[] array = null;
で、変数arrayに明示的にnull
を代入しています。つまり変数arrayは何も指し示していません(下図)。次の行ではその変数arrayの2番目の要素に10を代入する記述となっていますが、変数arrayは何も指し示していませんので、要素は存在しません。したがって、実行時エラーとなります。
上記のプログラムのように、意図的にnullを代入してエラーを起こすプログラムを書くことはありませんが、規模の大きなプログラムになると、意図しないところで変数がnullになってしまった。ということも少なくありません。
その対策として、参照型変数がnullかどうかをチェックしてから変数を扱うプログラムを書く方法があります。プログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { int[] array = new int[5]; if(array == null){ System.out.println("変数arrayは空です"); } else { System.out.println(array.length); } } }
実行結果
5
解説
array == null
で変数arrayがnullかどうかをチェックし、次のいずれかの動作をします。
- 変数arrayがNULLなら、「変数arrayは空です」と表示
- 変数arrayがNULLでなければ、配列の長さを表示
5-6 二次元配列
二次元配列は、複数の配列をまとめたもので表のような構造を実現します。二次元配列のイメージを下に示します。
なお、本教材では下図を含め、以降の説明において便宜的に
- 二次元配列の横の並びを「行」
- 二次元配列の縦の並びを「列」
- 5-5までに学習した通常の配列を「一次元配列」
と表現します。
二次元配列の使い方も通常の配列と同様の下の3手順で示します。
- 変数の宣言
- 配列の生成と代入
- 各要素の利用
(1)変数の宣言
二次元配列を扱う変数宣言の文法は次のようになります。
型[][] 変数名;
記述例
int[][] array;
(2)配列の生成と代入
二次元配列を生成し、変数に代入する文法は次のようになります。
変数名 = new 型名[行数][列数];
記述例
array = new int[4][3];
通常の配列同様、下記の文法を使うことで(1)と(2)を同時に行うことができます。
型[][] 変数名 = new 型名[行数][列数];
次の方法ではさらに、値を同時に設定することも可能です。
型[][] 変数名 = { {値,値,値,....}, {値,値,値,....}, ・・・・ }
(3)各要素の利用
各要素を利用するための文法は次のようになります。
変数名[行番号][列番号]
二次元配列を使ったプログラム例を示します。
public class Main { public static void main(String[] args) { //二次元配列の宣言 int[][] arrays = { {1,2,3,4}, {11,12,13,14}, {21,22,23,24} }; //二次元配列内の要素の表示 System.out.println(arrays[1][2]); } }
変数arrays
が示す二次元配列は下図のようになります。
10行目のarrays[1][2]
は、変数arraysが指す配列の(0から数えて)1行2列目なので、上図でオレンジの囲みが交わる13
となります。
5-6-1 二次元配列の構造
二次元配列を活用するには、二次元配列の構造を正しく理解する必要があります。
プログラム例と図を示し、二次元配列の構造を説明します。
public class Main { public static void main(String[] args) { //二次元配列の宣言 int[][] arrays = { {1,2,3,4,5}, {11,12,13}, {21,22,23,24} }; //配列数を表示 System.out.println(arrays.length); //2番目の配列の要素数を表示 System.out.println(arrays[2].length); //特定の要素を表示 System.out.println(arrays[1][2]); } }
プログラム中の二次元配列arraysのイメージを図に示します。
図に示すとおり、二次元配列を扱う変数(ここではarrays
)が指し示しているのは、参照型変数の配列です。その参照型変数の配列の各要素がそれぞれ個別の配列を指し示している構造となっています。
そのため、今回の例のように個々の一次元配列の要素数が異なっていても問題ありません。
変数arraysは参照型変数の配列を指し示しているので、10行目のarrays.length
は図に示す部分の個数となります。
また、12行目のようにarrays[要素数]
と記述することで、個々の一次元配列を指し示すことができます。したがって、arrays[2].length
は図中の一番下の配列の要素数を示すことになります。
5-6-2 二次元配列とfor文
二次元配列の各要素を使った処理を行なう際は、for文を使うと便利です。プログラム例を示します。
public class Main { public static void main(String[] args) { //二次元配列の宣言 int[][] arrays = { {1,2,3,4,5}, {11,12,13}, {21,22,23,24} }; //各行の処理 for(int row = 0; row < arrays.length; row++){ //各列の処理 for(int col = 0; col < arrays[row].length; col++){ System.out.print(arrays[row][col] + " "); } System.out.println(); } } }
- 外側のfor文は各行を参照するためのくり返し文です。
- 内側のfor文は各列を参照するためのくり返し文です。
- 外側のfor文の条件式を
arrays.length
とすることで、配列の数だけくり返し文を実行します。 - 内側のfor文の条件式を
arrays[row].length
とすることで、各一次元配列の要素の数だけくり返し文を実行します。
row
とcol
は、それぞれ行を意味する英単語「row」と列を意味する英単語「column」に基づいています。よく用いられる変数名の1つです。