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
相关产品推荐
相关产品推荐

