繁体   English   中英

错误数组索引超出某些代码的范围

[英]Error array index out of bounds in some code

我的递归函数中有一个数组索引超出范围异常。 有人可以向我指出为什么会这样吗? 这行:return minChange(a,IntegerList); 数组索引超出范围异常,也很可能出现以下情况:

返回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)


如何解决此数组索引超出范围的异常。 似乎需要固定一行。 如果是这样,我该如何解决该错误? 有什么办法?

为什么失败:

导致越界异常的特定事件序列如下:

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时才使用-递增是毫无意义的。 请记住,除非您将它们作为参数传递,否则函数中的局部变量在每次递归调用中都会被“重置”。

调试策略:

首先,阐明您实际上希望算法执行的操作。

然后,检查它的实际作用。 作为一种调试技术,我建议在函数调用开始时添加一些print语句:

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

...以便您可以查看崩溃之前发生的情况的日志。 您也可以为此使用调试器。

最后,一旦在一些简单的情况下可以使用,编写一个模糊测试器,在一堆随机列表和不同大小a s上检查您的算法,以查看是否遗漏了任何情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM