簡體   English   中英

java:S2189:“向此循環添加結束條件。”。 請你幫助我好嗎?

[英]java:S2189: “Add an end condition to this loop.”. Could you please help me?

我正在嘗試解決有關這段代碼的 Sonarqube 問題

private void processEvents() {
    long nextSequence = sequence.get() + 1L;

    long groupCounter = 0;
    long msgsInGroup = 0;

    long groupLastNs = 0;

    long l2dataLastNs = 0;
    boolean triggerL2DataRequest = false;

    final int tradeEventChainLengthTarget = sharedPool.getChainLength();
    MatcherTradeEvent tradeEventHead = null;
    MatcherTradeEvent tradeEventTail = null;
    int tradeEventCounter = 0; // counter

    while (true) {
        try {

            // should spin and also check another barrier
            long availableSequence = waitSpinningHelper.tryWaitFor(nextSequence);

            if (nextSequence <= availableSequence) {
                while (nextSequence <= availableSequence) {

                    OrderCommand cmd = ringBuffer.get(nextSequence);
                    nextSequence++;

                    // some commands should trigger R2 stage to avoid unprocessed state in events
                    if (cmd.command == OrderCommandType.RESET
                            || cmd.command == OrderCommandType.PERSIST_STATE_MATCHING
                            || cmd.command == OrderCommandType.BINARY_DATA) {
                        groupCounter++;
                        msgsInGroup = 0;
                    }

                    cmd.eventsGroup = groupCounter;

                    cmd.serviceFlags = 0;
                    if (triggerL2DataRequest) {
                        triggerL2DataRequest = false;
                        cmd.serviceFlags = 1;
                    }

                    // cleaning attached events
                    if (EVENTS_POOLING && cmd.matcherEvent != null) {

                        // update tail
                        if (tradeEventTail == null) {
                            tradeEventHead = cmd.matcherEvent; //?
                        } else {
                            tradeEventTail.nextEvent = cmd.matcherEvent;
                        }

                        tradeEventTail = cmd.matcherEvent;
                        tradeEventCounter++;

                        // find last element in the chain and update tail accourdingly
                        while (tradeEventTail.nextEvent != null) {
                            tradeEventTail = tradeEventTail.nextEvent;
                            tradeEventCounter++;
                        }

                        if (tradeEventCounter >= tradeEventChainLengthTarget) {
                            // chain is big enough -> send to the shared pool
                            tradeEventCounter = 0;
                            sharedPool.putChain(tradeEventHead);
                            tradeEventTail = null;
                            tradeEventHead = null;
                        }

                    }
                    cmd.matcherEvent = null;

                    // TODO collect to shared buffer
                    cmd.marketData = null;

                    if (cmd.command == OrderCommandType.NOP) {
                        // just set next group and pass
                        continue;
                    }

                    msgsInGroup++;

                    // switch group after each N messages
                    // avoid changing groups when PERSIST_STATE_MATCHING is already executing
                    if (msgsInGroup >= msgsInGroupLimit && cmd.command != OrderCommandType.PERSIST_STATE_RISK) {
                        groupCounter++;
                        msgsInGroup = 0;
                    }

                }
                sequence.set(availableSequence);
                groupLastNs = System.nanoTime() + GROUP_MAX_DURATION_NS;

            } else {
                final long t = System.nanoTime();
                if (msgsInGroup > 0 && t > groupLastNs) {
                    // switch group after T microseconds elapsed, if group is non empty
                    groupCounter++;
                    msgsInGroup = 0;
                }

                if (t > l2dataLastNs) {
                    l2dataLastNs = t + L2_PUBLISH_INTERVAL_NS; // trigger L2 data every 10ms
                    triggerL2DataRequest = true;
                }
            }

        } catch (final AlertException ex) {
            if (running.get() != RUNNING) {
                break;
            }
        } catch (final Throwable ex) {
            sequence.set(nextSequence);
            nextSequence++;
        }
    }
}

問題在於帶有 try catch 的 while(true) 循環。 我試圖將 while(true) 放入 try 塊中,但這會產生巨大的編譯錯誤。 這段代碼不是我寫的,是老師給我考試的一個項目。

引入一個變量,而不是

while (true) {
    ...
}

您可以從循環內控制它

boolean running = true;
...
while (running) {
    ...
    if (condition) {
        running = false;
    }
}

或者,如果循環要繼續迭代,或者創建一個方法來驗證任何必要的標准:

while (isValid(input)) {
    ...
}

並定義方法

boolean isValid( ... method args here ... ) {
    ...
}

例如,如果只要nextSequence不為 0,循環就應該一直持續下去,那么這一切都可以簡化為

while (nextSequence != 0) {
    ...
}

請注意,在這種情況下,您不能使用編譯時間常數。 如果將其設置為 false,您將因無法訪問代碼而收到錯誤消息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM