では「逆順処理でよくあるバグ(境界条件ミスや 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]);
}
Javaarr.length = 0の場合 →i = -1から開始 → ループに入らないので安全だが、意図せず処理がスキップされることがある- ✅ 空配列を事前にチェックするのがベスト
if (arr.length == 0) return;
Java3. リストの逆順処理での 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 のセットを習慣にすると安全です。


