JavaScriptプログラミングのスキルアップに役立つ!「Errors: Bad continue」エラーの解決策と代替方法


continue ステートメント は、ループの 現在のイテレーション をスキップして次のイテレーションへ進むために使用されます。 しかし、ループの外 で使用したり、ネストされたループ外側のループ をスキップしようとすると、このエラーが発生します。

エラーの例

for (let i = 0; i < 5; i++) {
  if (i === 2) {
    continue; // エラー: 無効な continue
  }
  console.log(i);
}

上記の例では、i === 2 の場合、continue ステートメントがループ で正しく使用されています。

しかし、以下のコードはエラーになります。

for (let i = 0; i < 5; i++) {
  if (i === 2) {
    continue; // エラー: 無効な continue
  }
  console.log(i);
}

console.log("ループ後"); // エラー: 無効な continue

この例では、continue ステートメントが ループの外 で使用されています。 これは無効であり、エラーが発生します。

解決策

このエラーを解決するには、以下のいずれかの方法を実行します。

  1. continue ステートメントをループ内でのみ使用する: continue ステートメントは、常にループ で使用するようにしてください。
  2. ネストされたループの外側ループをスキップしたい場合は、適切なラベルを使用する: ネストされたループの外側ループをスキップしたい場合は、continue ステートメントではなく、ラベル付き break ステートメントを使用する必要があります。


for (let outer = 0; outer < 3; outer++) {
  for (let inner = 0; inner < 5; inner++) {
    if (inner === 2) {
      continue; // ループ内の次のイテレーションへ進む
    }
    if (outer === 2 && inner === 3) {
      break outer; // 外側のループをスキップ
    }
    console.log(`outer: ${outer}, inner: ${inner}`);
  }
}

上記の例では、inner ループ内で i === 2 の場合、continue ステートメントが ループ内 の次のイテレーションへ進むように正しく使用されています。

また、outer === 2 && inner === 3 の場合、break outer ステートメントを使用して 外側のループ (outer) を スキップ しています。

  • continue ステートメントは、for ループだけでなく、while ループや do-while ループでも使用できます。


無効な continue ステートメントの使用

この例では、continue ステートメントが ループの外 で使用されているため、エラーが発生します。

for (let i = 0; i < 5; i++) {
  if (i === 2) {
    continue; // エラー: 無効な continue
  }
  console.log(i);
}

console.log("ループ後"); // エラー: 無効な continue

解決策

  • continue ステートメントを ループ内 でのみ使用するように修正します。
for (let i = 0; i < 5; i++) {
  if (i === 2) {
    // continue; // 削除
  }
  console.log(i);
}

ネストされたループの外側ループを誤ってスキップ

この例では、continue ステートメントを使用して ネストされたループ外側ループ をスキップしようとしていますが、これは無効であり、エラーが発生します。

for (let outer = 0; outer < 3; outer++) {
  for (let inner = 0; inner < 5; inner++) {
    if (inner === 2) {
      continue; // エラー: 無効な continue
    }
    console.log(`outer: ${outer}, inner: ${inner}`);
  }
}

解決策

  • ネストされたループの外側ループをスキップしたい場合は、continue ステートメントではなく、ラベル付き break ステートメントを使用します。
for (let outer = 0; outer < 3; outer++) {
  for (let inner = 0; inner < 5; inner++) {
    if (inner === 2) {
      // continue; // 削除
    }
    if (outer === 2 && inner === 3) {
      break outer; // 外側のループをスキップ
    }
    console.log(`outer: ${outer}, inner: ${inner}`);
  }
}

この例では、return ステートメントを使用してループのイテレーションをスキップしています。 returncontinue と異なり、関数から完全に終了するため、ループ内の次のイテレーションへは 進みません

function myFunction() {
  for (let i = 0; i < 5; i++) {
    if (i === 2) {
      return; // ループを終了
    }
    console.log(i);
  }
}

myFunction();
  • エラーメッセージはブラウザや JavaScript エンジンによって異なる場合があります。
  • 上記の例はあくまで一例であり、状況に応じて様々なバリエーションが考えられます。


適切なループ構造を使用する

  • 配列の反復処理方法
    配列を反復処理するには、for ループ以外にも、forEachmapreduce などの便利な方法があります。 これらの方法は、より簡潔で効率的なコードを書くのに役立ちます。
  • switch ステートメント
    特定の条件に基づいて異なる処理を実行する必要がある場合は、switch ステートメントを使用することができます。 これは、複数の if-else ステートメントよりも簡潔で読みやすいコードになります。
  • ネストされたループ
    ネストされたループを使用して、より複雑なループ条件を処理することができます。 外側のループを使用して全体的な反復を制御し、内側のループを使用して特定の条件に基づいて個々の要素を処理することができます。


// ネストされたループを使用して偶数のみを出力
for (let i = 0; i < 10; i++) {
  if (i % 2 === 0) {
    for (let j = 0; j < 5; j++) {
      console.log(`i: ${i}, j: ${j}`);
    }
  }
}
// switch ステートメントを使用して曜日ごとに挨拶を出力
const day = 3;

switch (day) {
  case 0:
    console.log("日曜日です");
    break;
  case 1:
    console.log("月曜日です");
    break;
  // ... 省略
  default:
    console.log("その他曜日です");
}
// forEach メソッドを使用して配列の要素にアクセス
const numbers = [1, 2, 3, 4, 5];

numbers.forEach(function(number) {
  console.log(number * 2);
});

ラベル付き break ステートメントを使用する

ネストされたループから外側のループをスキップしたい場合は、continue ステートメントではなく、ラベル付き break ステートメントを使用する必要があります。


for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 5; j++) {
    if (j === 2) {
      continue; // ループ内の次のイテレーションへ進む
    }
    if (i === 2 && j === 3) {
      break outer; // 外側のループをスキップ
    }
    console.log(`i: ${i}, j: ${j}`);
  }
}

条件に応じてループを終了する

ループを特定の条件で終了させたい場合は、break ステートメントを使用することができます。


for (let i = 0; i < 10; i++) {
  if (i > 5) {
    break; // ループを終了
  }
  console.log(i);
}

早期リターンを使用する

関数から特定の条件に基づいて早期に返る場合は、return ステートメントを使用することができます。


function isEven(number) {
  if (number % 2 !== 0) {
    return false; // 偶数ではない場合は false を返す
  }
  return true; // 偶数であれば true を返す
}

const result = isEven(7);
console.log(result); // false
  • コードの可読性とメンテナンス性を高めるために、適切なコメントを記述することを忘れないでください。
  • 上記の代替方法はあくまで一例であり、状況に応じて最適な方法を選択する必要があります。