【问题标题】:Error array index out of bounds in some code某些代码中的错误数组索引超出范围
【发布时间】:2019-09-05 21:01:15
【问题描述】:

我的递归函数中存在数组索引越界异常。有人可以向我指出为什么会这样吗? 这一行: return minChange(a, IntegerList);数组索引超出范围异常以及很可能是这一行:

return minimumValue(1 + minChange(a - d, integerList), minChange(a, updatedList));

    /* Function minChange: Minimum Change
    Pseudo-code:
    minChange(0, ds)      = 0
    minChange(a, [])      = Failure
    minChange(a, d :: ds) = minChange(a,ds)                     if d > a
    minChange(a, d :: ds) = min(1 ++ minChange(a - d, d :: ds)  otherwise
     */
    public int minChange(int a, List<Integer> integerList) {

        //int minimumResult = 0;
        int indexNumber = 0;

        int d = integerList.get(indexNumber); (line 246)

        if(a == 0) {
            // If a is 0 return 0
            return 0;

        } else if(integerList.isEmpty()) {
            return -1;

        } else if(d > a) {

            integerList.remove(indexNumber); // Remove first element from list

            // Recursive call to minChange
            return minChange(a, integerList); (line 261)

        } else {
            // Create updatedList and remove first element
            List<Integer> updatedList = integerList;
            updatedList.remove(indexNumber);
            indexNumber++;

            return minimumValue(1 + minChange(a - d, integerList), minChange(a, updatedList)); (line 269)

        }


Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out-of-bounds for length 0
at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:246)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:261)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:269)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:269)
    at AlgorithmsSetZero.minChange(AlgorithmsSetZero.java:269)


如何修复这个数组索引越界异常。似乎需要修复一条线。如果是这样,我该如何解决这个错误?有哪些方法?

【问题讨论】:

  • 你能包含整个堆栈跟踪吗?
  • 什么意思?
  • 编译器出错时抛出的整个段落。它有行号告诉你是什么导致了错误。无论如何,我认为您的int d = integerList.get(indexNumber); 是导致问题的原因。在indexNumber 获取元素之前,请确保列表不为空。
  • 我添加了错误的堆栈。

标签: java arrays indexoutofboundsexception


【解决方案1】:

为什么会失败:

导致越界异常的特定事件序列将是,例如:

minChange(1, [4]) // goes into second-to-last (else if) case, since 4 > 1. 4 is then removed.
minChange(1, [])  // crashes

不清楚在这种情况下您的代码打算做什么,因为您的伪代码没有定义minChange(a, ds)

即使我们规定输入列表必须有多个项目,我们也会经常遇到同样的情况:

minChange(5,[4, 8])
minChange(1,[8])
minChange(1,[])

我不确定你打算在这里发生什么,但是,无论如何,还有其他问题......

错误:

这行代码中很可能存在错误:

// this just creates another reference to the existing list
// https://stackoverflow.com/questions/6536094/java-arraylist-copy
// meaning: both recursive calls will operate on the same list
// even though one uses the "updatedList" reference and one uses "integerList"
List<Integer> updatedList = integerList;

另外,indexNumber 的使用表示一个错误,因为它仅在值为 0 时使用 - 递增是没有意义的。请记住,函数中的局部变量在每次递归调用中都会“重置”,除非您将它们作为参数传递。

调试策略:

首先,明确你真正希望算法做什么。

然后,检查它实际上在做什么。作为一种调试技术,我建议在函数调用的开头添加一些打印语句:

System.out.println("minChange(" + a + ", " + integerList + ")");

...这样您就可以看到崩溃前发生的事情的日志。您也可以为此使用调试器。

最后,一旦它适用于一些简单的案例,编写一个模糊测试器,在一堆随机列表和不同大小的as 上检查你的算法,看看是否有任何你遗漏的案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多