Android 跨Activity传递EditText数值转Int后运算崩溃或结果为0问题
问题诱因
- 传参接收方法错误:第二个Activity中调用的
getString()是Context类提供的方法,作用是读取res/strings.xml下的本地字符串资源,无法读取前一个Activity通过putExtra传递的参数,导致拿到的字符串为null或者无效值,调用Integer.parseInt时要么崩溃要么转换结果为0。 - 输入内容与转换类型不匹配:EditText的
inputType设置为decimal number,允许用户输入带小数点的数值,此时获取到的字符串包含.符号,Integer.parseInt无法解析带小数点的字符串,会抛出NumberFormatException直接导致应用崩溃。 - 空输入未做校验:如果用户未输入内容就跳转页面,拿到的字符串是空串,
Integer.parseInt解析空串也会抛出异常导致崩溃。
解决方案
- 修正传参接收逻辑:第二个Activity中先通过
getIntent()获取意图对象,再调用getStringExtra()读取传递的参数。 - 匹配输入类型与转换逻辑:
- 如果业务只允许输入整数:直接将EditText的
inputType修改为number,从输入源头限制用户只能输入整数,避免出现小数点。 - 如果业务允许输入小数:将接收后的数值转换为
Float或Double类型存储,不要强制转换为int避免精度损失或者解析异常。
- 如果业务只允许输入整数:直接将EditText的
- 增加异常校验逻辑:封装安全的数值转换方法,对空值、非法格式输入做捕获处理,设置兜底默认值避免崩溃。
修正后参考代码如下:
// 第二个Activity中接收参数逻辑 Intent inputIntent = getIntent(); String correctNum = inputIntent.getStringExtra("c_a"); String wrongNum = inputIntent.getStringExtra("w_a"); String blankNum = inputIntent.getStringExtra("b_a"); String allNum = inputIntent.getStringExtra("a_a"); float res = 0; int cN = safeParseInt(correctNum, 0); int wN = safeParseInt(wrongNum, 0); int bN = safeParseInt(blankNum, 0); int aN = safeParseInt(allNum, 0); // 安全转换int的工具方法,输入非法时返回默认值 private int safeParseInt(String str, int defaultValue) { if (str == null || str.trim().isEmpty()) { return defaultValue; } try { // 兼容带小数的输入,先转double再取整 double num = Double.parseDouble(str.trim()); return (int) num; // 若仅允许整数,可替换为 return Integer.parseInt(str.trim()); } catch (NumberFormatException e) { return defaultValue; } }
内容的提问来源于stack exchange,提问作者Farzad Moradkhani
相关产品推荐
相关产品推荐

