for迴圈正確遍歷陣列
也許有人覺得for迴圈遍歷陣列很簡單啊,但是不明白for迴圈的原理,很容易造成嚴重的後果。最近有個專案,技術人員離職了,客戶有個需求要修改,我就去現場幫忙改了一下,更新後第四天,客戶打來電話說,系統出現漏費情況了,我開始覺得是不是客戶搞錯了,因為我只是修改了一個很簡單的功能啊,不至於影響到費用啊,但是遠端連到客戶那邊發現確實是漏費了,我趕緊跑到了現場。
由於前期技術人員沒按照規範來程式設計,出錯的那個類有11261行,出錯的那個方法有1102行,由於服務執行在jetty上面,客戶端訪問tomcat通過zookeeper + rpc再去訪問jetty。我電腦上不具備debug的條件,程式碼排查起來非常的困難。據客戶反映這種情況是我這次更新造成的,我把我寫的程式碼排查了一遍又一遍,一直沒發現問題,我甚至開始懷疑是不是我的電腦環境有問題,編譯的時候造成了某些外掛不匹配。由於方法體太長了,邏輯判斷也非常的複雜,排查了一整個下午,毫無進展,當我幾乎絕望的時候,突然發現一個for迴圈的迴圈體好像沒有執行到。for迴圈是遍歷一個數組,寫法如下:
for(int i=0;examPart[i]!=0;i++) {
迴圈體
}
我趕緊去找examPart[]賦值的地方,定義的地方如下:
int[] examPart = {0,0,0,0};
後面根據不同的條件分別給examPart的四個成員進行了賦值。
根據業務邏輯,終於明白了技術人員的意圖,他是想遍歷examPart的四個成員,對值不為0的成員進行處理。
說到這,明白for迴圈原理的人,可能就發現問題的原因了,當examPart某個成員為0的時候,直接就跳出迴圈了,此時剛好examPart[0]為0,所以迴圈體一次也沒執行到。大家有沒有發現這種寫法還存在一個問題,如果examPart
下面我們來分析一下如何正確的用for迴圈來遍歷陣列。
我們先看一下for迴圈的定義。
for( 初始語句 ; 執行條件 ; 增量 )
{
迴圈體
}
執行順序:1、初始語句 2、執行條件是否符合? 3、迴圈體 4、增加增量
初始化語句只在迴圈開始前執行一次,每次執行迴圈體時要先判斷是否符合條件,如果迴圈條件還為true,則執行迴圈體,再執行迭代語句。對於for迴圈,迴圈條件總比迴圈體多執行一次。
明白了for迴圈的定義後,我們可以很好的來寫for迴圈如何遍歷陣列了。
針對上面的程式碼我們應該修改如下:
for(int i=0;i<examPart.length;i++) {
if (examPart[i]==0) then continue;
迴圈體
}
更簡潔一下可以修改如下: for (int i : examPart) {
if (i==0) then continue;
迴圈體
}