Kotlin中TextWatcher触发NumberFormatException问题求助
问题描述
为EditText实现TextWatcher后,执行val h = height.toFloat()时抛出java.lang.NumberFormatException,异常信息显示输入字符串为"interface kotlin.jvm.functions.Function0"。调试发现txt_height!!.text.toString().trim { it <= ' ' }返回了这个异常字符串,而EditText默认值应为"175"。
TextWatcher实现代码
txt_height!!.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) { isExecuteSeekbar = false } override fun onTextChanged(charSequence: CharSequence, i: Int, i1: Int, i2: Int) {} override fun afterTextChanged(editable: Editable) { var height = txt_height!!.text.toString().trim { it <= ' ' } if (height.equals(".", ignoreCase = true)) txt_height!!.setText("2.0") height = txt_height!!.text.toString().trim { it <= ' ' } if (!sh!!.check_blank_data(height) && isExecute) { val h = height.toFloat() if (rdo_feet!!.isChecked) { for (k in height_feet_lst.indices) { if (height.equals(height_feet_lst[k], ignoreCase = true)) { pickerFeet!!.selectedItem = k break } } } else { for (k in height_cm_lst.indices) { if (h == height_cm_lst[k].toFloat()) { pickerCM!!.selectedItem = k break } } } saveData() } isExecuteSeekbar = true } })
相关使用代码
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) initHeight() body() } fun initHeight() { heightList.clear() for (k in 60..240) { heightList.add("" + k) } val st = arrayOfNulls<CharSequence>(heightList.size) for (k in heightList.indices) { st[k] = "" + heightList[k] } picker!!.values = st picker!!.sideItems = 1 picker!!.setOnItemSelectedListener { index -> txt_height!!.setText(st[index]) } } fun body(){ if (!sh!!.check_blank_data(SharedPreferencesManager.height)) { if (rdo_cm!!.isChecked) { txt_height!!.filters = arrayOf<InputFilter>(DigitsInputFilter(3, 0, 240.0)) txt_height!!.setText(SharedPreferencesManager.height.toString()) } else { txt_height!!.filters = arrayOf<InputFilter>(InputFilterRange(0.00, height_feet_elements)) txt_height!!.setText(SharedPreferencesManager.height.toString()) } } else { if (rdo_cm!!.isChecked) { txt_height!!.filters = arrayOf<InputFilter>(DigitsInputFilter(3, 0, 240.0)) txt_height!!.setText("150") } else { txt_height!!.filters = arrayOf<InputFilter>(InputFilterRange(0.00, height_feet_elements)) txt_height!!.setText("5.0") } } } object SharedPreferencesManager { private val ctx: Context get() = Application.instance private fun createSharedPreferences(): SharedPreferences { return ctx.getSharedPreferences(AppUtils.USERS_SHARED_PREF, Context.MODE_PRIVATE) } private val sharedPreferences by lazy { createSharedPreferences() } var height: String get() = sharedPreferences.getString(AppUtils.HEIGHT,"")!! set(value) = sharedPreferences.edit().putString(AppUtils.HEIGHT, value).apply() }
错误分析与解决
问题出在body()函数里的SharedPreferencesManager.height.toString()调用上:
SharedPreferencesManager.height本身就是String类型,无需额外调用.toString()。但此处的.toString()实际作用于函数引用(大概率是语法或底层调用异常导致),最终返回了函数签名字符串"interface kotlin.jvm.functions.Function0"。
修改后的body()函数:
fun body(){ if (!sh!!.check_blank_data(SharedPreferencesManager.height)) { if (rdo_cm!!.isChecked) { txt_height!!.filters = arrayOf<InputFilter>(DigitsInputFilter(3, 0, 240.0)) txt_height!!.setText(SharedPreferencesManager.height) // 移除多余的.toString() } else { txt_height!!.filters = arrayOf<InputFilter>(InputFilterRange(0.00, height_feet_elements)) txt_height!!.setText(SharedPreferencesManager.height) // 移除多余的.toString() } } else { if (rdo_cm!!.isChecked) { txt_height!!.filters = arrayOf<InputFilter>(DigitsInputFilter(3, 0, 240.0)) txt_height!!.setText("150") } else { txt_height!!.filters = arrayOf<InputFilter>(InputFilterRange(0.00, height_feet_elements)) txt_height!!.setText("5.0") } } }
额外优化建议:
- 对
height.toFloat()增加异常捕获,避免非法输入导致崩溃:
try { val h = height.toFloat() // 后续匹配选择器逻辑 } catch (e: NumberFormatException) { // 处理非法输入,比如提示用户或重置EditText内容 }
内容的提问来源于stack exchange,提问作者Marduk
相关产品推荐
相关产品推荐

