You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin计算器开发问题:点击等号按钮返回null值求排查建议

计算器点击等于返回null的问题排查与修复要点

核心问题:运算符匹配失败

看你提供的运算符赋值代码,除法按钮的赋值多了一个空格:

binding.btnDel.id -> {
    op = "/ " // 这里的空格导致后续匹配失败
}

而buEqualEvent的when分支判断的是无空格的"/",当用户点击除法按钮后,op的值是"/ ",完全匹配不到任何分支,导致finalNumber始终为null,调用toString()就会显示null。

修复:把除法的赋值改成op = "/",去掉多余空格。


其他需要注意的错误与优化点

  • 空值与非数字校验
    oldNumber或newNumber为空、或者无法转成数字时,直接调用toDouble()会崩溃,需要提前校验:

    fun buEqualEvent(view: View) {
        val newNumber = binding.rezStr.text.toString()
        val oldNum = oldNumber.toDoubleOrNull() ?: return // 转失败直接终止逻辑
        val newNum = newNumber.toDoubleOrNull() ?: return
        var finalNumber: Double? = null
    
        when (op) {
            "*" -> finalNumber = oldNum * newNum
            "/" -> finalNumber = oldNum / newNum
            "+" -> finalNumber = oldNum + newNum
            "-" -> finalNumber = oldNum - newNum
        }
        // ...后续逻辑
    }
    
  • 给when语句加默认分支
    万一op出现意料外的值(比如拼写错误),添加默认分支避免finalNumber为null:

    when (op) {
        // 现有分支...
        else -> {
            binding.rezStr.text = "无效运算符"
            isNewOp = true
            return
        }
    }
    
  • 除法除数为0的处理
    除数为0时会抛出算术异常,需要提前判断:

    "/" -> {
        if (newNum == 0.0) {
            binding.rezStr.text = "不能除以0"
            isNewOp = true
            return
        }
        finalNumber = oldNum / newNum
    }
    
  • 初始化状态校验
    oldNumber初始为空字符串,若用户未输入数字就点运算符,后续转Double会失败,可在运算符点击事件里加判断:

    fun buOpEevent(view: View) {
        val currentText = binding.rezStr.text.toString()
        if (currentText.isEmpty()) return // 空输入时不执行后续逻辑
        // ...现有赋值逻辑
        oldNumber = currentText
    }
    

内容的提问来源于stack exchange,提问作者KsKlim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 17:31:02