我有一個遍歷一串數字的 for 回圈。我還有一個與字串長度相同的陣列,該陣列由表示該索引最大值的數字組成。代碼遍歷字串和陣列的每個索引,并檢查字串中 i 處的數字是否小于或等于陣列中 i 索引處的最大值。
在這種情況下,字串長度為 11,因此陣列長度也是 11。因此,字串和陣列的索引從 0 到 10 開始。問題是有時 for 回圈會隨機上升到 11 并導致程式崩潰并給出越界錯誤。我說隨機是因為它可以是第一組迭代或第四組迭代。我查看了除錯器(Intelli-J IDEA),它在步進時,我上升了。我不明白為什么會這樣。
代碼:
for(int i = 0; i < stringOfNumbers.length(); i ){
System.out.println(i); // Print for debug purpose
if(Integer.parseInt(String.valueOf(stringOfNumbers.charAt(i))) <= arrayOfMaxValues[i]){
// do something
// successful run
}
else{
// do something
// unsuccessful run
}
}
這是控制臺給我的:
0
1
2
3
4
5
6
7
8
9
10
Iteration 1 done
0
1
2
3
4
5
6
7
8
9
10
11
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 11 out of bounds for length 11
at Main.checkValidity(Main.java:91)
at Main.main(Main.java:63)
uj5u.com熱心網友回復:
Java 決議“從左到右”。至關重要的是,錯誤發生在arrayOfMaxValues[i],而不是 stringOfNumbers.charAt(i)。如果stringOfNumbers真的有 11 的長度,它會在那里崩潰,帶有IndexOutOfBoundsException(而不是ArrayIndexOutOfBoundsException)。
結論:您的字串至少有 12 個字符長。
您粘貼的代碼并未表明這是如何發生的,但它確實發生了。您的 for 回圈從 0 回圈到字串的長度。因此,如果字串的長度為 Y,而您的陣列的長度為 X,其中 Y 大于 X,這種情況總是會發生。搜索您寫入字串的代碼。
如果您寫入零件內的字串// do something,您就會得到解釋。Java 實際上并沒有從這個 for 回圈開始:對,我們從 0 回圈到 10,因為現在 stringOfNumbers.length()是 11。
這不是它的作業原理。Java 通過執行 for 回圈 ( int i = 0) 的初始化程式來啟動回圈,然后將立即檢查條件(0小于stringOfNumbers當前變數指向的任何長度?它是;現在 stringOfNumbers.length()是 11)。然后它回圈,一旦回圈完成,它執行增量部分(i ),然后簡單地重新運行運算式i < stringOfNumbers.length(),如果運算式為假,它將跳出回圈。
因此,如果您stringOfNumbers在回圈內更新,回圈將稍后結束。
如果你不想這樣,不要寫信給stringOfNumbers; 寫入其他內容并stringOfNumbers在回圈后覆寫。或者,您可以這樣做:
for (int i = 0, len = stringOfNumbers.length(); i < len; i ) { ... }
這會在 for 回圈開始時“快取”長度,并且只檢查i這個快取的長度,而不是stringOfNumbers當前指向的長度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/445064.html
