Kotlin安卓开发:点击按钮后App崩溃,抛出NumberFormatException异常
问题根因
报错日志明确抛出java.lang.NumberFormatException: For input string: "",核心原因是原代码的空值判断逻辑存在漏洞:DenaryInput.text本身永远不会为null,仅判断它非空完全无法拦截用户没有输入的场景,此时调用toString()会得到空字符串,再调用toInt()就会直接触发格式异常导致闪退。此外代码中大量使用!!强制解包可空变量,也存在空指针崩溃的风险。
修复后可直接运行的代码
import kotlinx.android.synthetic.main.activity_main.* button.setOnClickListener { // 提取输入内容并去除前后空白字符 val inputContent = DenaryInput.text.toString().trim() // 尝试转换为整数,转换失败返回null不会抛出异常 val denaryNum = inputContent.toIntOrNull() if (denaryNum != null) { var temp = denaryNum var binResult = "" // 处理输入为0的边界场景 if (temp == 0) { binResult = "0" } else { while (temp > 0) { binResult += (temp % 2).toString() temp /= 2 } binResult = binResult.reversed() } textView.text = binResult } else { // 非法输入给出友好提示,避免闪退 textView.text = "请输入有效的十进制整数" } }
核心优化点说明
- 替换
toInt()为toIntOrNull():转换失败时直接返回null,不会抛出崩溃异常,通过非空判断即可拦截所有非法输入 - 修正了无效的空值判断逻辑:直接对输入内容做非空、格式合法性校验,覆盖空输入、非数字输入等所有异常场景
- 移除不必要的可空变量声明与
!!强制解包操作:从根源避免空指针崩溃风险,同时简化代码逻辑 - 补充0值输入的边界处理:原逻辑输入0时不会进入循环,会输出错误结果
- 增加非法输入的友好提示:用户输入不符合要求时会得到明确反馈,不会无响应或闪退
内容的提问来源于stack exchange,提问作者Set GFX
相关产品推荐
相关产品推荐

