[英]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.