Android应用使用负数时发生崩溃,if(expiry_num>0)行报错如何解决?
问题原因分析
- 你观测到崩溃发生在
if(expiry_num>0)行大概率是行号映射偏差,实际崩溃根源出在Integer.parseInt(expiry)步骤:- 服务端返回的
Minutes字段可能为空、null、包含非数字字符(比如小数点、空格、特殊符号) - 服务端返回的数值超出int类型的取值范围(-2147483648 ~ 2147483647),尤其是负数值绝对值过大时会直接抛出
NumberFormatException - 没有做异常捕获,解析失败时应用直接崩溃
- 服务端返回的
修复方案
增加空值判断和异常捕获逻辑,兼容服务端返回的异常格式,修改后代码如下:
// 先判空避免空指针异常 Object minuteObj = StatusInfo.get("Minutes"); if (minuteObj == null) { // 空值可根据业务需求走兜底逻辑,这里默认不执行后续流程 return; } // 去除前后空格避免空格导致解析失败 String expiry = minuteObj.toString().trim(); int expiry_num = 0; try { expiry_num = Integer.parseInt(expiry); } catch (NumberFormatException e) { // 超出int范围时尝试用long解析判断正负 try { long expiryLong = Long.parseLong(expiry); expiry_num = expiryLong > 0 ? 1 : -1; } catch (NumberFormatException ex) { // 完全为非合法数字时,默认判定为不满足大于0的条件 expiry_num = 0; } } if (expiry_num > 0) { DetailsHandling(); }
补充说明
如果服务端可能返回带小数的数值(比如2.5),可以先转成BigDecimal再取整判断,避免解析失败;也可以根据业务需求调整解析失败后的默认逻辑,比如弹窗提示服务端异常、走其他兜底流程。
内容的提问来源于stack exchange,提问作者Malhotra
相关产品推荐
相关产品推荐

