一、问题描述
最近调试Android APP,在运行时出现如下错误的信息。如上描述,这是一个运行时错误,导致app多次crash。既然是一个运行时错误,一般和参数或者是格式化有关。代码跟踪发现是由于String.format 函数导致的,将参数打印到字符串格式化的时候发生的一个错误。
1 java.util.Formatter.getArgument(Formatter.java:1111)
2 java.util.Formatter.doFormat(Formatter.java:1076)
3 java.util.Formatter.format(Formatter.java:1042)
4 java.util.Formatter.format(Formatter.java:1011)
5 java.lang.String.format(String.java:1803)
6 java.lang.String.format(String.java:1777)
7 cn.xxx.xxx.utils.SPUtils.cacheLastPassedCar(SPUtils.java:173)
8 cn.xxx.xxx.service.BusinessService$10.onResponse(BusinessService.java:1042)
二、解决问题
我把发生问题的SPUtils.java:173
的代码摘录出来(由于业务代码过于庞杂,这里简化一下):
int channelId = 1;
String.format("last_passed_car_%d_%s",channelId);
从代码中我们很容易看出来,需要匹配的参数有%d和%s,但给出的入参只有整数类型的channelId,所以导致Formatter的错误。因为String.format的入参是变参,所以编译的时候检查不出来,在运行时才能发现。
解决的办法很简单:检查一下待格式化的匹配参数,要么把%d或者%s的数量去掉,要么对齐匹配的参数。
问题解决完毕,本贴完!
评论已关闭