Kotlin代码BMI计算异常排查:循环终止及toFloat()疑问
问题分析与修复方案
原始问题
要求将formula和updatebmi函数放在ViewModel中,val f与run函数位于Main Activity内。目前程序出现终止情况,怀疑toFloat()存在问题,同时发现Kotlin的if语句仅返回第一个条件,未检查else if分支。
原始代码
val f = bmiViewModel.updatebmi(bmiViewModel.formula(inc, wt, ft)) run(f) fun formula(inc: Int, ft: Int, wt: Int): Float { val htTotal = (ft*12).toFloat() + inc.toFloat() val BMI = (wt.toFloat()*703) / (htTotal * htTotal) Log.d(TAG,"BMI", Exception()) return BMI fun updatebmi(total: Float): Int{ if (total < 18.5) { return -256 } else if (total >= 18.5 && total < 24.9) { return 8 } else if (total >= 24.9 && total < 30) { return 256 } else{ return 16 } } private fun run(i: Int){ if (i == -256) { binding.status.text = "Under Weight" binding.status.setTextColor(i) } else if (i == 8) { binding.status.text = "Normal" binding.status.setTextColor(i) } else if (i == 256) { binding.status.text = "Overweight" binding.status.setTextColor(-256) } else{ binding.status.text = "Obese" binding.status.setTextColor(16) } }
核心问题与修复
1. 语法错误:函数未闭合
formula函数末尾缺少闭合的},这会直接导致代码无法编译运行,是最紧急的修复点。
2. BMI分类边界值错误
updatebmi的条件不符合标准BMI分类逻辑:
- 正常体重的上限应为小于25(而非24.9)
- 超重的起始值应为25(而非24.9)
修正后的updatebmi(建议用更清晰的when表达式):
fun updatebmi(total: Float): Int { return when { total < 18.5 -> -256 total < 25 -> 8 // 正常体重:18.5 ≤ BMI < 25 total < 30 -> 256 // 超重:25 ≤ BMI < 30 else -> 16 // 肥胖:BMI ≥ 30 } }
3. 潜在的除以0异常
若输入的身高(ft和inc均为0),会导致htTotal为0,计算BMI时触发ArithmeticException(除以0),直接终止程序。需添加输入校验:
在formula函数开头加入:
if (ft == 0 && inc == 0) { throw IllegalArgumentException("身高不能为0") }
或在Activity层先校验输入合法性,确保身高不为0再调用ViewModel方法。
4. 颜色值使用错误
run函数中setTextColor(i)使用的-256、8等不是有效的Android颜色值(需为ARGB格式Int值)。修正为:
import android.graphics.Color private fun run(i: Int) { val (statusText, statusColor) = when(i) { -256 -> "体重过轻" to Color.BLUE 8 -> "体重正常" to Color.GREEN 256 -> "体重超重" to Color.parseColor("#FFA500") // 橙色 else -> "肥胖" to Color.RED } binding.status.text = statusText binding.status.setTextColor(statusColor) }
关于toFloat()和if语句的疑问
toFloat()本身无问题:Int转Float对于身高体重这类小数值是完全安全的。- Kotlin的if-else if分支会依次检查,不会只执行第一个条件,你遇到的问题是语法错误和边界值设置错误导致的逻辑异常,而非语言特性问题。
内容的提问来源于stack exchange,提问作者Nikki
相关产品推荐
相关产品推荐

