サンプルコード
3章

3 章

多重ループ

ポイント:多重ループはそれぞれが最大で何回ループするのかを意識する

サンプルコード

for (int i=0; i < 5; i++) {
  for (int j=1; j <= 3; j++) {
    System.out.println(i + " : " + j);
    if (j == 2) break;
  }
}
 
// 出力結果
// 0 : 1
// 0 : 2
// 1 : 1
// 1 : 2 ... 続く

解説

  1. 外のループは、0 ~ 4 なので最大 5 回ループする
  2. 中のループは、1 ~ 3 なので最大 3 回ループする
  3. 4 行目の break で 中のループは最大 2 回のループになる
  4. よって、上記の出力結果のような出力パターンになる

continue, break

繰り返し処理の際に一緒に使われることの多い continue, break ですが、Java Silver ではひっかけ問題として出題されることがあります。
このようなひっかけ問題はなるべく時間をかけずに一目でコンパイルエラーを見抜けることが試験では試されます。
(*サンプルコードでは continue を使用していますが、break に置き換えても同じ結果になります)

if 文単体には使用できない

if (true) {
  System.out.println("foo");
  continue;
}

到達しない処理

for(int i=0; i < 5; i++) {
  if (i == 3) {
    continue;
    System.out.println("foo");
  }
}

多重ループと continue, break

多重ループと continue, break が絡んだときに continue や break がどの制御文に対して動作しているのかを理解する必要があります。
以下のサンプルコードの例では、break は switch 文に対して動作するので、出力まで行われますが、continue は for 文に対して動作するため、出力がスキップされます。

// コマンド:java src/Main.java foo bar baz
// 出力結果:foo baz
 
public static void main(String[] args) {
  for (String s : args) {
    switch (s) {
      case "foo":
        break;
      case "bar":
        continue;
    }
    System.out.print(s + " ");
  }
}

++, -- の前置と後置の挙動

考え方

  • ++ or --をしてからxxをする
  • xxをしてから++ or --をする
  • 違いはこれだけ

後置

for (int i=0; i < 5 ;) {
  System.out.print(i++ + " "); // 後置なので<出力>してから<++>している
}
 
// 出力:0 1 2 3 4

前置

for (int i=0; i < 5 ;) {
  System.out.print(++i + " "); // 前置なので<++>してから<出力>している
}
 
// 出力:1 2 3 4 5

for 文の記述方法パターン

Java Silver では for 文の有効な記述方法を問われる問題が出題されることがあります。
どのパターンが有効なのか瞬時に見極めることが試験では問われます。

int i = 0;
for(i; i < 5; i++) {}                         // 【😡】 初期化式では値を初期化しなければならない
for(i += 1; i < 5; i++) {}                    // 【😊】
int i1 = 0, i2 = 0;
for(i1++, i2++; i1+i2 < 5; i1++) {}           // 【😊】
for(int i1=0, int i2=0; i1+i2 < 5; i1 ++) {}  // 【😡】 初期化式で宣言できる変数の型は一つのみ
for(int i1=0, i2=0; i1+i2 < 5; i1++ ) {}      // 【😊】
for(int i1=0, i2=0; i1+i2 < 5; i1++, i2++) {} // 【😊】

null の print 出力

null は print 出力できます。NullPointerException は発生しないため注意が必要。

String[] ary = new String[3];
for (String s : ary) { System.out.print(s + " "); } // null null null