配列の問題で、「lengthと最後の添字を間違える」「多次元配列のどこを見ているのかわからなくなる」ということはありませんか。
配列は基本文法のひとつですが、宣言の書き方・参照の共有・拡張for文が組み合わさると、短いコードでも読み違えやすくなります。
この記事では、Java Silver SE17の学習向けにオリジナル問題を10問用意しました。実際の認定試験問題や市販問題集の問題を転載・再現したものではありません。各問題は、答えを見る前に実行結果やエラーの有無を考えてみてください。
Java Silver SE17の配列問題では、配列の宣言や初期化だけでなく、要素へのアクセス、拡張for文、多次元配列の構造を正しく理解する必要があります。
特に多次元配列では、各行の要素数が異なるケースや、添字によるアクセスで実行時例外が発生するケースに注意が必要です。
この記事の問題を通して、コードを1行ずつ読み、実行結果やコンパイル可否を判断する力を身につけましょう。
配列問題で最初に確認する4つのこと
- 変数の型と配列の次元は何か
- 配列が生成済みか、参照先がnullか
- lengthが外側と内側のどちらの要素数を表すか
- 値のコピーか、同じ配列への参照の共有か
配列の要素数はlengthフィールドで取得します。Stringのlength()やArrayListのsize()とは書き方が違います。また、lengthが3なら有効な添字は0~2です。
Java Silver SE17の配列・多次元配列問題10選
各コードは、ほかの問題と独立したMainクラスとして扱います。「実行時に例外が発生する」と「コンパイルエラー」は区別してください。
問題1:配列変数の宣言と次元
public class Main {
public static void main(String[] args) {
int[] a, b[];
a = new int[2];
b = new int[3][1];
System.out.print(a.length + ":" + b.length);
}
}
このコードの結果として正しいものを選んでください。
- 2:3
- 2:1
- コンパイルエラー
- 実行時に例外が発生する
答えと解説を見る
正解は1:2:3
int[] a, b[];では、aはint[]、bはint[][]です。bの外側の配列には3つの要素があり、b.lengthは3になります。角括弧が型の後ろと変数名の後ろに分かれている場合は、変数ごとに合計して次元を確認します。普段のコードでは変数を分けて宣言すると読みやすくなります。
問題2:生成した配列の要素の初期値
public class Main {
public static void main(String[] args) {
int[] numbers = new int[2];
boolean[] flags = new boolean[1];
String[] names = new String[1];
System.out.print(numbers[0] + ":" + flags[0] + ":" + names[0]);
}
}
このコードの結果として正しいものを選んでください。
- 0:false:null
- 0:true:null
- 0:false:空文字
- コンパイルエラー
答えと解説を見る
正解は1:0:false:null
生成された配列の各要素には初期値が入ります。intは0、booleanはfalse、Stringなどの参照型はnullです。String配列の要素が自動的に空文字になるわけではありません。また、ローカルの配列変数を宣言しただけの場合は、配列自体が生成されるわけでもありません。
問題3:宣言後の配列の初期化
public class Main {
public static void main(String[] args) {
int[] values;
values = {4, 8};
System.out.print(values[0]);
}
}
このコードの結果として正しいものを選んでください。
- 4
- 8
- 実行時に例外が発生する
- コンパイルエラー
答えと解説を見る
正解は4:コンパイルエラー
波括弧だけの配列初期化子は、このような代入文の右辺には書けません。宣言と同時ならint[] values = {4, 8};と書けます。宣言後に代入するならvalues = new int[]{4, 8};とします。
問題4:lengthと添字の範囲
public class Main {
public static void main(String[] args) {
int[] values = {5, 10, 15};
System.out.print(values[values.length]);
}
}
このコードの結果として正しいものを選んでください。
- 15
- 3
- ArrayIndexOutOfBoundsException
- コンパイルエラー
答えと解説を見る
正解は3:ArrayIndexOutOfBoundsException
lengthは要素数であり、最後の要素の添字ではありません。要素数3の配列で使える添字は0・1・2です。values[3]はコンパイルできますが、実行時にArrayIndexOutOfBoundsExceptionが発生します。最後の要素を読むならvalues[values.length – 1]です。
問題5:要素数0の配列
public class Main {
public static void main(String[] args) {
int[] values = new int[0];
System.out.print(values.length);
}
}
このコードの結果として正しいものを選んでください。
- 0
- null
- NegativeArraySizeException
- コンパイルエラー
答えと解説を見る
正解は1:0
要素数0の配列は生成できます。配列オブジェクトは存在し、lengthは0です。ただしvalues[0]にアクセスすると範囲外です。要素数0の配列と、配列への参照がないnullは区別してください。
問題6:行ごとに長さが違う多次元配列
public class Main {
public static void main(String[] args) {
int[][] grid = {{2, 4}, {6}, {8, 10, 12}};
System.out.print(grid.length + ":" + grid[0].length + ":" + grid[2][1]);
}
}
このコードの結果として正しいものを選んでください。
- 3:2:10
- 3:3:10
- 2:3:8
- コンパイルエラー
答えと解説を見る
正解は1:3:2:10
grid.lengthは外側の要素数なので3です。grid[0].lengthは最初の内側の配列の長さなので2です。grid[2][1]は3つ目の内側の配列の添字1にある10です。Javaの多次元配列は配列を要素として持つため、各行の長さが同じである必要はありません。
問題7:内側の配列をまだ生成していない場合
public class Main {
public static void main(String[] args) {
int[][] grid = new int[2][];
System.out.print(grid[0].length);
}
}
このコードの結果として正しいものを選んでください。
- 0
- 2
- NullPointerException
- コンパイルエラー
答えと解説を見る
正解は3:NullPointerException
new int[2][]は、int[]への参照を2つ持つ外側の配列を生成します。内側の配列はまだ生成されておらず、grid[0]とgrid[1]はnullです。nullからlengthを読み取ろうとするためNullPointerExceptionが発生します。grid[0] = new int[3];などの生成が必要です。
問題8:配列の代入と参照の共有
public class Main {
public static void main(String[] args) {
int[] original = {3, 6};
int[] shared = original;
shared[1] = 20;
System.out.print(original[1]);
}
}
このコードの結果として正しいものを選んでください。
- 6
- 20
- 3
- コンパイルエラー
答えと解説を見る
正解は2:20
配列変数の代入は要素のコピーではなく、参照のコピーです。originalとsharedは同じ配列を参照しているため、shared[1]を書き換えるとoriginal[1]からも20が見えます。独立した配列が必要ならclone()やArrays.copyOf()などでコピーします。
問題9:拡張for文でループ変数を書き換える
public class Main {
public static void main(String[] args) {
int[] values = {2, 4, 6};
for (int value : values) {
value *= 10;
}
System.out.print(values[0] + ":" + values[2]);
}
}
このコードの結果として正しいものを選んでください。
- 20:60
- 2:6
- 20:6
- コンパイルエラー
答えと解説を見る
正解は2:2:6
ループ変数valueには、各要素のint値が渡されます。valueを変更しても配列の要素には代入されません。配列の要素を書き換えるなら、添字を使ってvalues[i] *= 10;とします。一方、参照型の要素ではループ変数を通じて参照先のオブジェクトを変更できる場合があります。
問題10:拡張for文から内側の配列を変更する
public class Main {
public static void main(String[] args) {
int[][] grid = {{1, 2}, {3, 4}};
for (int[] row : grid) {
row[0] += 10;
row = new int[]{0, 0};
}
System.out.print(grid[0][0] + ":" + grid[1][0]);
}
}
このコードの結果として正しいものを選んでください。
- 0:0
- 1:3
- 11:13
- コンパイルエラー
答えと解説を見る
正解は3:11:13
rowは内側の配列への参照を受け取ります。row[0] += 10;は、その配列の要素を変更するためgridにも反映されます。一方、row = new int[]{0, 0};はループ変数の参照先を変えるだけで、gridの各要素を置き換えません。参照先の変更と、参照先オブジェクトの要素の変更を分けて考えましょう。
コンパイルエラーと実行時例外を整理する
| 状況 | 結果 | 確認する点 |
|---|---|---|
| 宣言後に波括弧だけで配列を代入する | コンパイルエラー | new int[]{…}などの式にする |
| 添字が0未満、またはlength以上 | ArrayIndexOutOfBoundsException | 有効な添字の範囲 |
| nullの配列からlengthを取得する | NullPointerException | 対象の配列が生成済みか |
10問の正答一覧
| 問題 | 正解 | 学習ポイント |
|---|---|---|
| 1 | 1:2:3 | 配列変数の宣言と次元 |
| 2 | 1:0:false:null | 生成した配列の要素の初期値 |
| 3 | 4:コンパイルエラー | 宣言後の配列の初期化 |
| 4 | 3:ArrayIndexOutOfBoundsException | lengthと添字の範囲 |
| 5 | 1:0 | 要素数0の配列 |
| 6 | 1:3:2:10 | 行ごとに長さが違う多次元配列 |
| 7 | 3:NullPointerException | 内側の配列をまだ生成していない場合 |
| 8 | 2:20 | 配列の代入と参照の共有 |
| 9 | 2:2:6 | 拡張for文でループ変数を書き換える |
| 10 | 3:11:13 | 拡張for文から内側の配列を変更する |
Java Silverの無料問題アプリで実力を確認しよう
配列・多次元配列の問題を解き終えたら、ほかの分野のコード読解問題にも挑戦してみましょう。
IT Engineer Logでは、Java Silver SE17向けの無料問題アプリを公開しています。
基本文法やオブジェクト指向、例外処理など、複数の分野をまとめて復習できます。間違えた問題は解説を確認し、理解できるまで繰り返し取り組むのがおすすめです。
Java Silver SE17の配列に関するよくある質問
Java Silverでは多次元配列も出題されますか?
はい。Java Silver SE17では、配列の宣言・初期化・要素へのアクセスに加え、多次元配列の扱いも理解しておく必要があります。特に、各行の要素数が異なる多次元配列や、添字を使ったアクセスの実行結果を確認しておきましょう。
配列の範囲外にアクセスするとどうなりますか?
配列の有効な添字の範囲外にアクセスすると、実行時にArrayIndexOutOfBoundsExceptionが発生します。配列の添字は0から始まるため、要素数が3の配列でアクセスできる添字は0、1、2です。
Javaの多次元配列は行ごとに要素数を変えられますか?
はい。Javaの多次元配列は配列の配列として扱われるため、行ごとに異なる要素数を設定できます。例えば、1行目は2要素、2行目は3要素という構造も作れます。試験では、各行の長さと添字の範囲を正しく把握することが重要です。
配列問題の復習方法
間違えた問題は、答えだけでなく「どの変数がどの配列を参照しているか」を書き出してみてください。多次元配列なら、外側の各要素から内側の配列への参照を整理すると、lengthやnullの読み違いを減らせます。
問題9と10はセットで復習するのがおすすめです。拡張for文でループ変数に代入しても配列の要素は置き換わりませんが、その変数から参照先の配列を変更することはできます。
正解できた問題も、要素数や添字を変えた場合の結果を考えてみましょう。自分の環境でコードを動かして確認すると、誤解していた箇所が見つかりやすくなります。
配列の理解をほかの分野につなげる
配列の参照が理解できたら、String・StringBuilder問題10選で参照と内容の比較を確認できます。エラーの扱いは、例外処理問題10選と合わせて復習してください。
学習の順番に迷う場合は、Java Silver一発合格の勉強法ロードマップで全体の進め方を確認できます。
さらに演習したい方は、Java Silver SE17対応の無料問題アプリの「配列とString」カテゴリも活用してください。登録不要でコード読解問題に取り組めます。
参考にした公式仕様
この記事はJava SE17の言語仕様に基づいて作成しています。配列の型・生成・アクセス・初期化はJava Language Specification 第10章 Arrays、拡張for文は第14章の拡張for文の仕様で確認できます。

コメント