2012-08-02 235 views
0

這是一種使用while循環的方法。我強烈懷疑無限循環是可能的。如何檢查並消除?我們如何確保while循環不會是無限循環?

我在這裏使用了兩個while循環。我可以完全拆除while循環嗎?

public class ReferenceListSaveHandler 
{ 
public PublishReferenceListUpdates populateResponse(SearchQueryResponse pSearchQueryResponse,SearchQueryResponse pListResponse, ObjectFactory objFactory)   throws IOException, ParserConfigurationException, SAXException,SipException, Exception 
    { 
     ReferenceDataProcessor lRefPro = new ReferenceDataProcessor(); 
     PublishReferenceListUpdates lResponse = null; 
     Record listRecord = null; 
     ReferenceDataListItemListType lReferenceDataListItemListType = objFactory 
      .createReferenceDataListItemListType(); 
     ReferenceDataListType lReferenceDataListType = null; 
     ReferenceDataListItemType lReferenceDataListItemType = null; 
     boolean ifSynonym = false; 
     String lRowIdObject = null; 
     final int lRowIdLength = 14; 

     if (refListItemItr.hasNext()) 
     { 
      Record record = (Record)refListItemItr.next(); 
      boolean continueProcessing = true; 
      boolean lastRecord = false; 
      while (continueProcessing) 
      { // first use of while loop 
       if (refListItemItr.hasNext() || lastRecord) 
       { 
        continueProcessing = true; 
        lastRecord = false; 
       } 
       else 
       { 
        continueProcessing = false; 
       } 

       if (continueProcessing) 
       { 
        lSynonymListType = objFactory 
         .createSynonymListType(); 

        Field itemLSIDField = record 
         .getField(ReferenceDataConstants.FIELD_COMPOUND_ASSET_ID); 

        if (itemLSIDField == null) 
        { 
         continue; 
        } 
        else 
        { 
         currentItemLSID = itemLSIDField 
          .getStringValue().trim(); 
        } 
        lReferenceDataListItemType = objFactory 
         .createReferenceDataListItemType(); 
        lReferenceDataListItemType = setListDetails(record, 
         lReferenceDataListItemType, 
         lId, lName, objFactory); 


        while (refListItemItr.hasNext() 
          && continueProcessing) 
        { // second use of while loop 
         SynonymType lSynonymType = null; 
         if (continueProcessing) 
         { 
          if (lSynonymType != null) 
           lSynonymListType.getSynonym().add(lSynonymType); 
         } 
        } 
        continueProcessing = true; 
       } 
      }//while loop 
     } 
    } 
} 

請幫忙。

回答

1

問題一:refListItemItr,不管它是什麼(未顯示其定義),有一個.next()方法,但它從來沒有所謂的循環中。

問題二:如果你進入它的第二個while環始終是無限的:

while (refListItemItr.hasNext() 
     && continueProcessing) 
{ 
    SynonymType lSynonymType = null; 
    if (continueProcessing) 
    { 
     if (lSynonymType != null) 
      lSynonymListType.getSynonym().add(lSynonymType); 
    } 
} 

無論refListItemItr.hasNext(),也可以continueProcessing這個循環中改變。這就是爲什麼它是一個無限循環。

編輯: 我不能告訴你如何改變代碼,因爲有很多可能的方式來改變它,這取決於應該發生什麼。你可以嘗試這個,但它可能會或可能不會工作:

  1. 完全刪除第二個循環(它現在什麼都沒做)。
  2. 只是第一圈結束前加入這一行:

    record = (Record)refListItemItr.next(); // ADD THIS LINE 
    } //while loop BEFORE THIS LINE 
    
+0

你好,我只是在開玩笑:很好的分析 – Alex 2012-08-02 11:37:38

+0

實際上它被調用了Record record =(Record)refListItemItr.next (); 還有一件事,爲什麼既不能refListItemItr.hasNext(),也不continueProcessing在循環內部進行更改?而且,我該如何糾正它? – dev 2012-08-02 12:48:15

+0

它被稱爲外**循環。 **在** while(continueProcessing)'行之前。 'hasNext'和'continueProcessing'不能在第二個循環內部改變,因爲你沒有改變它們(你不是程序員,是嗎?)。 – Alex 2012-08-03 08:09:47

0

這是一個無窮遠循環,外循環依賴於未beeing設置爲true,在程序

+0

這是無限的,但不是因爲'lastRecord'變量(它總是'FALSE'因此'如果(refListItemItr.hasNext ()|| lastRecord)'相當於'if(refListItemItr.hasNext())' – Alex 2012-08-02 11:31:49

0

我扔在一個循環計數器,每當我寫的字while,這樣在任何地方lastrecord

int loopCounter = 0, maxLoops = 1000; //just an example 
while((loopCounter++) < maxLoops && (myConditions)) 
{ 
    // loop away, this can't ever be infinite 
} 

或本

int loopCounter = 0, maxLoops = 1000; //just an example 
do  
{ 
    // loop away, this can't ever be infinite 
} 
while((loopCounter++) < maxLoops && (myConditions)) 

當然,maxLoops總是尺寸爲幅度較大的日訂單迭代的任何合理數量的......然後,我添加一個檢查:

if (loopCounter == maxLoops) { throw new InvalidOperationException("Infinite loop detected!"); }