0

これは、while ループを使用している方法です。無限ループの可能性を強く疑っています。それを確認して排除する方法は?

ここでは 2 つの 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
        }
    }
}

助けてください。

4

3 に答える 3

1

問題1:refListItemItrそれが何であれ(その定義は示されていません)、.next()メソッドがありますが、ループ内で呼び出されることはありません。

問題 2: 2 番目のwhileループに入ると、常に無限になります。

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

このループ内refListItemItr.hasNext()では もも変更できません。continueProcessingというわけで無限ループです。

編集:コードを変更する方法は、何が起こるかによって、変更する方法がたくさんあるため、教えることはできません。これを試すことができますが、うまくいかないかもしれません:

  1. 2 番目のループを完全に削除します (現在は何もしません)。
  2. 最初のループの終わりの直前に次の行を追加します。

        record = (Record)refListItemItr.next(); // ADD THIS LINE
    } //while loop BEFORE THIS LINE
    
于 2012-08-02T11:36:26.890 に答える
0

次のように、単語を書くたびにループカウンターをスローしますwhile

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!"); }
于 2012-08-02T11:33:31.877 に答える
0

lastrecordこれは無限ループです。外側のループは、プログラムのどこでも true に設定されていないものに依存します。

于 2012-08-02T11:29:42.183 に答える