1. 程式人生 > >for迴圈正確遍歷陣列

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

的四個成員都不為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;

            迴圈體
         }