也許有人覺得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的四個成員都不爲0,會出現什麼情況?當遍歷完最後一個數組成員後,繼續執行i++,繼續判斷執行條件,就會出現數組越界的情況了,編程完全不考慮異常情況啊,這也是爲什麼第三方用戶一直抱怨說,你們現場技術人員寫的代碼經常出現越界的情況。原因找到了,技術人員也離職了,總得給客戶一個交代吧,挺大的一個鍋我背下來了。
下面我們來分析一下如何正確的用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;
循環體
}