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

Kotlin计算器when分支失效始终返回0问题排查求助

问题分析与解决方案

嘿,我一眼就揪出问题所在啦!你的计算器始终返回0,核心原因是操作符的获取时机完全错了,咱们一步步拆解解决:

1. 核心问题:opType只在初始化时获取一次

你在onCreate方法里直接写了var opType = operation.selectedItem.toString(),这意味着这个变量只会在Activity刚创建时,获取一次Spinner的默认选项。不管用户后续怎么切换Spinner的选择,calculate函数里的when判断用的还是最初的那个值!如果默认选项不是+、-、*、/中的任何一个,那每次都会走到else分支返回0——这就是你遇到的根本问题。

2. 次要问题:calculate函数的逻辑可以更严谨

你的else分支只给result赋值了0,但没有直接return(虽然最后有统一return,但这种写法容易出错);另外,你还重复定义了局部变量btn,覆盖了全局的btn变量,虽然不影响功能,但属于冗余代码。

修正后的完整代码

class MainActivity : AppCompatActivity() {
    lateinit var myresult: TextView
    lateinit var val1: EditText
    lateinit var btn: Button
    lateinit var val2: EditText
    lateinit var operation: Spinner

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        myresult = findViewById(R.id.txtresult)
        val1 = findViewById(R.id.valone)
        val2 = findViewById(R.id.valtwo)
        btn = findViewById(R.id.button) // 去掉重复的var,使用全局变量
        operation = findViewById(R.id.spinner)

        btn.setOnClickListener {
            println(calculate().toString())
            myresult.text = calculate().toString()
        }
    }

    fun calculate(): Int {
        // 关键修改:每次计算时才获取当前选中的操作符
        val opType = operation.selectedItem.toString()
        // 增加非空判断,避免空字符串转Int崩溃
        val value1 = val1.text.toString().takeIf { it.isNotEmpty() }?.toInt() ?: 0
        val value2 = val2.text.toString().takeIf { it.isNotEmpty() }?.toInt() ?: 0

        return when (opType) {
            "+" -> value1 + value2
            "-" -> value1 - value2
            "*" -> value1 * value2
            "/" -> {
                // 额外优化:避免除以0的崩溃
                if (value2 != 0) value1 / value2 else 0
            }
            else -> 0
        }
    }
}

额外优化说明

  • 移除了onCreate里重复定义的局部btn变量,统一使用全局变量
  • 增加了EditText非空判断,防止用户未输入内容时触发NumberFormatException
  • 增加了除法时的除数非零判断,避免ArithmeticException崩溃
  • 简化了calculate函数逻辑,直接在when分支返回结果,不需要额外的result变量

这样修改后,每次点击按钮计算时,都会获取当前Spinner选中的操作符,就能正确触发对应的计算分支啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:24:53