簡體   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