![](/img/trans.png)
[英]Can someone help me correct this java loop. It's so close to being right
[英]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.