36区技术博客

String.format出现MissingFormatArgumentException的解决办法


一、问题描述

最近调试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的数量去掉,要么对齐匹配的参数。

问题解决完毕,本贴完!

当前页面是本站的「Baidu MIP」版。查看和发表评论请点击:完整版 »