You need to enable JavaScript to run this app. Kotlin温度转换器:EditText为空选单选按钮后点击转换按钮崩溃
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 10:27:03