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;

            循環體
         }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章