Java循环触发IndexOutOfBoundsException异常的最优解决方法是什么?
问题分析
首先明确原报错的核心原因:
- List的索引范围是
0 ~ size-1,原for循环的终止条件为i < size,当i迭代到size-2或size-1时,访问c.get(i+2)的索引已经超出合法范围,直接触发IndexOutOfBoundsException - 你现有的修复方案虽然解决了越界问题,但存在两处冗余:同一边界条件重复判断两次,且for循环默认自增i和内部手动i++的逻辑混用,可读性较差。
优化实现方案
jumpingOnClouds问题的核心要求是求最少跳跃次数,优先跳2步是最优策略,我们可以改用更贴合步长不固定场景的while循环,从根源避免越界,代码如下:
public static int jumpingOnClouds(List<Integer> c) { int size = c.size(); int jumpCount = 0; int currentIndex = 0; // 只要没到最后一朵云就继续跳 while (currentIndex < size - 1) { // 优先判断能不能跳2步:先判断索引合法,再判断云是普通云(值为0) if (currentIndex + 2 < size && c.get(currentIndex + 2) == 0) { currentIndex += 2; } else { // 不能跳2步就跳1步 currentIndex += 1; } // 每次操作对应一次跳跃 jumpCount++; } return jumpCount; }
优化点说明
- 循环终止条件直接限定为
currentIndex < size - 1,只要到达最后一朵云就停止循环,不会出现多余的跳跃计数 - 利用Java
&&运算符的短路特性,只要currentIndex + 2 < size不成立,就不会执行后续的c.get取值操作,天然避免索引越界 - 手动控制索引的增减,没有和for循环的默认自增逻辑混用,代码逻辑和跳跃规则完全对应,可读性和可维护性更强
- 没有冗余的边界判断,代码更简洁,执行效率也更高
内容的提问来源于stack exchange,提问作者DoubleLiu
相关产品推荐
相关产品推荐

