Kotlin应用中NumberFormatException异常排查:同逻辑代码为何一正常一报错?
问题:同一安卓应用中第二个页面函数抛出NumberFormatException异常
Logcat错误输出
Process: com.example.barkod okuyucu, PID: 9955 java.lang.NumberFormatException: Invalid long: "9786257901444" at java.lang.Long.invalidLong(Long.java:124) at java.lang.Long.parse(Long.java:361) at java.lang.Long.parseLong(Long.java:352) at java.lang.Long.parseLong(Long.java:318)
正常运行的MainActivity2.kt代码
var barkod = intent.getStringExtra("m1") binding.textView2.text = barkod.toString() val context = this var db = DataBaseHelper(context) binding.button2.setOnClickListener { var etadi = binding.editTextText.text var etsnkullanmatrh = binding.editTextNumber.text var etadet = binding.editTextNumber2.text var etbarkod = binding.textView2.text if (etadi.isNotEmpty() && etsnkullanmatrh.isNotEmpty()) { var kullanici = Kullanici(etadi, etbarkod.toLong(), etsnkullanmatrh.toInt(), etadet.toInt()) db.insertData(kullanici) } else { Toast.makeText(applicationContext, "lutfen", Toast.LENGTH_LONG).show() } }
抛出异常的MainActivity3.kt代码
var barkod = intent.getStringExtra("n1") binding.textView3.text = barkod val context = this var db = DataBaseHelper(context) binding.button3.setOnClickListener { var etadi = binding.editTextText2.text var etsnkullanmatrh = binding.textView5.text var etadet = binding.editTextNumber4.text var etbarkod = binding.textView3.text if (etadi.isNotEmpty() && etsnkullanmatrh.isNotEmpty()) { var kullanici = Kullanici(etadi, etbarkod.toLong(), etsnkullanmatrh.toInt(), etadet.toInt()) db.insertData(kullanici) } else { Toast.makeText(applicationContext, "lutfen", Toast.LENGTH_LONG).show() } }
问题分析与解决方法
- 核心问题:
etbarkod字符串无法转换为Long类型,表面看"9786257901444"是合法数字,但实际可能包含隐藏字符(如前后空格、全角字符、换行符),或是TextView文本处理逻辑导致字符串异常。 - 关键差异:MainActivity2设置TextView文本时调用了
barkod.toString(),而MainActivity3直接赋值barkod。若barkod为null或携带隐藏格式,直接赋值会导致TextView文本包含异常内容。 - 修复步骤:
- 统一文本设置逻辑:在MainActivity3中设置TextView文本时,同样调用
toString():binding.textView3.text = barkod.toString() - 清理字符串格式:转换Long前先去除前后空格,同时用
toLongOrNull()避免崩溃:val barkodLong = etbarkod.trim().toLongOrNull() ?: run { Toast.makeText(applicationContext, "条形码格式无效", Toast.LENGTH_SHORT).show() return@setOnClickListener } var kullanici = Kullanici(etadi, barkodLong, etsnkullanmatrh.toInt(), etadet.toInt()) - 验证Intent参数:确认传递
n1参数时是纯数字字符串,无额外字符或格式错误。
- 统一文本设置逻辑:在MainActivity3中设置TextView文本时,同样调用
内容的提问来源于stack exchange,提问作者Sezar
相关产品推荐
相关产品推荐

