按钮触发计数异常:localCounter到4但globalCounter停在3的排查与修复
计数器值不一致问题的原因分析与解决
问题场景
初始两个int变量localCounter = 0、globalCounter = 0,按钮按下时执行以下逻辑:
if (localCounter < 4) { localCounter++; } if (localCounter < 4) { globalCounter++; }
现象:localCounter能达到4,但globalCounter最多到3;如果把第二个判断改成localCounter <= 4,globalCounter会无限制递增。
原因分析
global停在3的原因:
每次按钮按下时,第一个if会先修改localCounter的值。当localCounter为3时:- 第一个
if判断3 < 4成立,localCounter被递增到4; - 第二个
if判断的是修改后的localCounter(即4),4 < 4不成立,所以globalCounter不会递增。
此时localCounter=4,globalCounter=3,之后再点击按钮,两个if的条件都不满足,数值不再变化。
- 第一个
改成
<=4后无限递增的原因:
当localCounter已经到4时,第一个if的4 < 4不成立,localCounter保持4;但第二个if的4 <=4成立,所以每次点击按钮,globalCounter都会被递增,导致无限增长。
解决方案
要让两个计数器同步增长到4且之后不再递增,核心是基于同一个判断条件操作两个变量,避免因先修改其中一个导致判断条件变化。
方案一:合并判断逻辑(最简洁)
if (localCounter < 4) { localCounter++; globalCounter++; }
这样每次判断仅基于修改前的localCounter值,只要满足<4,两个变量同时递增,最终都会停在4。
方案二:用临时变量保存判断结果
如果必须分开执行两个递增操作,可以先把判断结果存下来,再分别使用:
boolean shouldIncrement = localCounter < 4; if (shouldIncrement) { localCounter++; } if (shouldIncrement) { globalCounter++; }
这样两个if都使用修改前的判断结果,保证逻辑一致性。
内容的提问来源于stack exchange,提问作者Nomad09
相关产品推荐
相关产品推荐

