Android App新增算式生成逻辑后点击选项按钮偶发崩溃
崩溃根因
偶发崩溃是数组索引越界(ArrayIndexOutOfBoundsException)导致的,触发点在setRandomButtonAnswer()方法,理论崩溃概率25%,小样本测试时很容易感知成半数崩溃,和你描述的现象完全匹配。
错误细节
你存选项按钮的answerButtons数组长度是4,Java数组从0开始计数,合法下标只能是0、1、2、3,但你生成正确答案随机位置的代码写错了区间:
public void setRandomButtonAnswer(){ int min = 1; int max = 5;//not inclusive (1-4) randButton = (int) (Math.random() * (max - min) + min); answerButtons[randButton].setText(Integer.toString(sum)); }
你对随机数公式的区间判断有误:
Math.random()返回值范围是[0.0, 1.0),取得到0取不到1- 代入你写的参数计算,最终值的范围是
[1.0, 5.0),强转int截断后得到的整数是1、2、3、4 - 只要随机出4,访问
answerButtons[4]就会直接越界崩溃,四个可能结果里有一个非法值,刚好是四分之一概率崩溃。 - 顺带一提,这段逻辑还会导致第一个按钮(索引0)永远是干扰项,永远不会放正确答案,破坏答题随机性。
修复方案
1. 先解决崩溃问题
把setRandomButtonAnswer()里的随机范围改成0-3的合法区间就行,建议直接复用你已经写好的randomNumber()工具方法,避免手写公式再出错:
public void setRandomButtonAnswer(){ // 左闭右开,传0和4刚好生成0/1/2/3四个合法下标 randButton = randomNumber(0,4); answerButtons[randButton].setText(Integer.toString(sum)); }
2. 顺手修复几个不崩溃但影响功能的逻辑bug
这些问题不会导致闪退,但会让App功能不符合预期:
- 倒计时文本拼接错误:
timerTextView.setText(Long.toString(timeLeft/1000) + 's')里的's'是char类型,Java里字符串和char做加法会把char转成ASCII码拼接,最后会显示成29115这种奇怪内容,把单引号改成双引号写成"s"就正常了。 - 随机数方法区间问题:你写的
randomNumber()是左闭右开逻辑,如果想生成包含上限的数(比如3到15包含15),调用时max要传目标值+1,比如生成加法的两个加数应该写randomNumber(3, 16),否则永远随机不到15。 - 干扰选项逻辑不合理:现在
generateButtonNumber()生成的干扰项固定在3-14区间,但两个加数相加的和范围是6-30,不仅会出现sum大于14时干扰项和正确答案差距过大的问题,sum在6-14区间时还可能随机出和sum一样的干扰项,导致多个按钮都是正确答案。建议改成围绕sum上下浮动生成干扰项,加个去重判断,避免四个按钮出现重复数值。
内容的提问来源于stack exchange,提问作者RoscoeBothra
相关产品推荐
相关产品推荐

