Kotlin函数无法返回false,触发数组越界异常问题排查
Kotlin函数异常分析与修复
问题代码
private fun check_letter_row(v:ViewGroup, i: Int):Boolean { helped_answer = helped_answer.lowercase() for (a in 0..helped_answer.length - 1) { if (v.getChildAt(i).tag.toString().lowercase() == helped_answer[a].toString()) { v.getChildAt(i).visibility = View.GONE return true } } return false }
问题根源
ArrayIndexOutOfBoundsException 触发原因
传入的参数i超出了ViewGroupv的子元素索引范围。ViewGroup的子元素索引从0到v.childCount - 1,如果i >= v.childCount,调用v.getChildAt(i)会触发索引越界异常,此时函数直接崩溃,无法走到最后的return false逻辑。无法返回false的原因
函数只有两种执行路径:要么在循环中找到匹配项返回true,要么触发异常终止执行,永远走不到循环结束后的return false。
修复方案
private fun check_letter_row(v:ViewGroup, i: Int):Boolean { // 先校验i的合法性,避免越界 if (i < 0 || i >= v.childCount) { return false } // 处理tag为空的情况,避免空指针 val targetTag = v.getChildAt(i).tag?.toString()?.lowercase() ?: return false // 用局部变量存储小写结果,不修改全局变量 val lowerCaseAnswer = helped_answer.lowercase() // 直接遍历字符,替代索引循环更简洁安全 for (char in lowerCaseAnswer) { if (targetTag == char.toString()) { v.getChildAt(i).visibility = View.GONE return true } } return false }
修复说明
- 增加
i的范围校验:超出合法索引直接返回false,避免异常。 - 空安全处理
tag:如果tag为null,直接返回false,避免空指针崩溃。 - 避免修改全局变量:将
helped_answer的小写结果存为局部变量,防止影响其他逻辑。 - 简化循环逻辑:直接遍历字符串字符,替代索引循环,减少出错概率。
内容的提问来源于stack exchange,提问作者Cagri Caglar
相关产品推荐
相关产品推荐

