客户反应了一个问题,进入充值页面,应用崩溃,这就很严重,在客户那边100%复现的问题,在我们这边却复现不出来
友情提示:通篇废话,末尾结论
我们心急如焚,开始排查问题。
1.首先我们从集成的友盟中定位到了错误信息
-[NSTaggedPointerString substringWithRange:]: Range {0, 18446744073709551614} out of bounds; string length 1
2.根据错误信息,我们很容易得到结论String越界了
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
//转换为货币形式
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
NSString *string = [formatter stringFromNumber:[NSNumber numberWithDouble:temp/10000]];
//此方法为去除前面的金钱符号
string = [string moneyFormate];
string = [string substringWithRange:NSMakeRange(0, string.length-3)];
NSString *tempDayL = [NSString stringWithFormat:@"%@",string];
3.如果想单纯的解决问题,我们很容易随便应付一下
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
//转换为货币形式
formatter.numberStyle = NSNumberFormatterCurrencyStyle;
NSString *string = [formatter stringFromNumber:[NSNumber numberWithDouble:temp/10000]];
//此方法为去除前面的金钱符号
string = [string moneyFormate];
if (string.length > 3) {
//添加判断,防止越界
string = [string substringWithRange:NSMakeRange(0, string.length-3)];
}
NSString *tempDayL = [NSString stringWithFormat:@"%@",string];
4.但是很显然,不找到根本原因,我们不会心安,首先我们假设数据的问题,也就是temp的问题,我们试了各种精度值,包括最容易出问题的精度值,也从-10000循环到了10000,不可思议的是,没有任何问题,可以大致排除数据的问题了。
5.我们像一个无头苍蝇一样找可能导致的问题。。。。。。
6.还是不墨迹了,在一个客户偶然的回答下,我们知道了客户是日本运营商,在我的脑海中迅速冒出了“日本”“货币”,然后我们迅速模拟日本的地区,进入充值,啪,崩了,我们高兴坏了。。。
7.通常货币形式,会返回类似 ¥5.00这样的格式,去掉金钱符号,substringWithRange:NSMakeRange(0, string.length-3) 所起的作用是取小数点之前的数,结果数为5,这就是我们要使用的数字
<a id="jump">aaa</a>8.但是在日本货币形式,日本的货币是没有小数点的,那我们的方法肯定会崩溃,知道了问题,我们就好解决了。
通篇全是废话,我们不应该使用定值来处理我们了解的事情,因为凡事没有绝对,还是相信电脑的逻辑吧!