Java | 逆順処理でよくあるバグ集

Java Java
スポンサーリンク

では「逆順処理でよくあるバグ(境界条件ミスや IndexOutOfBounds)」を整理してみます。


1. 境界条件の off-by-one エラー

for (int i = arr.length - 1; i > 0; i--) {
    System.out.println(arr[i]);
}
Java
  • i > 0 にすると arr[0] が出力されない
  • ✅ 正しくは i >= 0

2. 空配列でのエラー

for (int i = arr.length - 1; i >= 0; i--) {
    System.out.println(arr[i]);
}
Java
  • arr.length = 0 の場合 → i = -1 から開始 → ループに入らないので安全だが、意図せず処理がスキップされることがある
  • ✅ 空配列を事前にチェックするのがベスト
if (arr.length == 0) return;
Java

3. リストの逆順処理での IndexOutOfBounds

for (int i = list.size(); i >= 0; i--) {
    System.out.println(list.get(i)); // ❌ IndexOutOfBoundsException
}
Java
  • list.size() は範囲外(最大インデックスは size()-1
  • ✅ 正しくは int i = list.size() - 1

4. foreach で逆順を無理に書こうとする

for (String s : list) {
    // ❌ foreach は逆順に対応していない
}
Java
  • 無理に foreach で逆順をやろうとすると混乱する
  • Collections.reverse(list) を使うか、for文で書く

5. Stream での境界条件ミス

IntStream.range(0, list.size())
         .map(i -> list.size() - i) // ❌ IndexOutOfBounds
         .forEach(i -> System.out.println(list.get(i)));
Java
  • list.size() - i は範囲外になる
  • ✅ 正しくは list.size() - 1 - i

バグを避けるコツ

  • 逆順ループは必ず i = size - 1 から始める
  • 条件は i >= 0 にする
  • 空配列/空リストは事前にチェック
  • foreach で逆順は無理せず Collections.reverse を使う
  • Stream では size() - 1 - i を忘れない

💡 逆順処理は「境界条件の1ズレ」が最も多いバグの原因です。レビューでも真っ先にチェックされるポイントなので、size()-1>=0 のセットを習慣にすると安全です。

タイトルとURLをコピーしました