已处理IndexOutOfRangeException,LeetCode提交仍报未处理运行时错误
问题排查与修复方案
嘿,我帮你找到了导致LeetCode运行时错误的核心原因!
问题根源
你的代码在处理边界值n=0时会直接触发数组越界异常,而且这个异常根本没被你的try-catch捕获:
- 当
n=0时,你创建的数组table长度是0+1=1,有效索引范围只有0; - 但你紧接着执行了
table[1] = 1,这行代码不在try-catch块内,直接访问了超出数组范围的索引,导致未处理的IndexOutOfRangeException; - 你本地测试没发现问题,大概率是因为没覆盖
n=0这个边界用例,而LeetCode的测试集必然包含该情况。
另外,你的try-catch其实完全没必要——靠捕获异常掩盖逻辑错误,既会影响性能,还会让真正的问题被隐藏。
修复方案
下面给你两种简洁可靠的修复方式,都是围绕先处理边界情况、确保数组访问安全展开:
方案1:先处理边界值(最直观)
根据斐波那契数列的定义,F(0)=0、F(1)=1,我们可以先把这两个情况直接返回,避免后续数组操作的风险:
public class Solution { public int Fib(int n) { // 直接返回边界情况的结果 if (n <= 1) { return n; } int[] table = new int[n + 1]; table[1] = 1; // 循环到n-1即可,避免多余的迭代 for (int i = 0; i < n - 1; i++) { table[i + 2] = table[i] + table[i + 1]; } return table[n]; } }
方案2:严格控制数组访问范围
如果你不想提前处理边界,也可以调整循环条件,确保所有数组索引访问都在有效范围内:
public class Solution { public int Fib(int n) { if (n == 0) return 0; int[] table = new int[n + 1]; table[1] = 1; // 循环到i <= n-2,保证i+2最多等于n(数组的最大索引) for (int i = 0; i <= n - 2; i++) { table[i + 2] = table[i] + table[i + 1]; } return table[n]; } }
内容的提问来源于stack exchange,提问作者Baran
相关产品推荐
相关产品推荐

