Kotlin温度转换器:EditText为空选单选按钮后点击转换按钮崩溃
崩溃根因
应用闪退的核心触发点在转换逻辑里的强转代码:
- 当输入框为空时,
etTemp.text.toString()拿到的是空字符串,直接调用.toInt()方法会抛出NumberFormatException,这个异常没有被捕获,就会直接导致应用崩溃。 - 除此之外代码还有两个潜在问题:一是没有校验用户输入的内容是否为合法数字,哪怕不是空,用户输入汉字、特殊符号时同样会触发相同的崩溃;二是用整数转换处理温度值会丢失小数精度,比如输入36.5℃这类带小数的温度时会直接出错。
修复方案
1. 前置输入校验,替换不安全的强转方法
把原来直接强转的逻辑替换成带空值判断的安全转换,在点击事件最开始就完成输入校验,不满足条件直接弹提示终止后续逻辑:
- 先对输入框内容做去空格处理,判断为空时直接提示用户输入温度值,终止执行
- 用
toDoubleOrNull()替代原来的toInt(),该方法遇到无法转换为数字的内容时会返回null,不会直接抛异常,判断为null时同样提示用户输入合法数值 - 复用输入取值的逻辑,不用在摄氏度、华氏度两个分支里重复写相同的取值转换代码
2. 修正后的完整可运行代码
class MainActivity : AppCompatActivity() { lateinit var etTemp: EditText lateinit var radioGroup: RadioGroup lateinit var btnConverter: Button lateinit var tempConverted: TextView override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) title = "Zeeshan's Temperature Converter" etTemp = findViewById(R.id.etTemp) radioGroup = findViewById(R.id.radioGroup) btnConverter = findViewById(R.id.btnConverter) tempConverted = findViewById(R.id.tempConverted) btnConverter.setOnClickListener { // 第一步:先做输入合法性校验 val inputStr = etTemp.text.toString().trim() if (inputStr.isEmpty()) { Toast.makeText(this@MainActivity, "请输入需要转换的温度值", Toast.LENGTH_SHORT).show() return@setOnClickListener } val tempValue = inputStr.toDoubleOrNull() if (tempValue == null) { Toast.makeText(this@MainActivity, "请输入合法的数字温度值", Toast.LENGTH_SHORT).show() return@setOnClickListener } // 第二步:判断选中的转换选项 val id = radioGroup.checkedRadioButtonId when (id) { R.id.radioC -> { // 摄氏度转华氏度 val result = tempValue * 9 / 5 + 32 tempConverted.setText(String.format("%.2f 华氏度", result)) } R.id.radioF -> { // 华氏度转摄氏度 val result = (tempValue - 32) / 1.8 tempConverted.setText(String.format("%.2f 摄氏度", result)) } else -> { Toast.makeText(this@MainActivity, "请选择一个转换方向", Toast.LENGTH_SHORT).show() } } } } }
3. 额外优化建议
- 在布局文件中给
etTemp添加输入类型限制:android:inputType="numberSigned|numberDecimal",从系统层面引导用户输入数字,减少非法输入的概率 - 显示转换结果时增加保留两位小数的格式化逻辑,避免出现无限小数的长文本影响显示效果
- 可以直接通过单选按钮的id做判断,不需要额外通过
findViewById获取RadioButton对象,减少多余的视图查找开销
内容的提问来源于stack exchange,提问作者Mohamed Zeeshan
相关产品推荐
相关产品推荐

