java.util.MissingFormatArgumentException: Format specifier '%s'
异常通常发生在使用了
String.format()
,
System.out.printf()
, 或类似方法进行字符串格式化时,但是提供的参数与格式化字符串中的占位符不匹配。在这个例子中,
%s
是一个占位符,用于表示一个字符串参数。
问题分析
当抛出这个异常时,意味着格式化字符串中有一个或多个 %s
占位符,但是在调用时并没有为它们提供相应的参数。
报错原因
- 格式化字符串中的
%s
数量多于提供的参数数量。 - 参数列表为空或者未正确传递参数。
解决思路
- 检查格式化字符串,确保
%s
的数量与提供的参数数量相匹配。 - 确保参数列表正确地传递给格式化方法。
解决方法
下滑查看解决方法
示例 1:错误的用法
String formatString = "Hello, %s! Today is %s.";
String result = String.format(formatString, "World"); // 缺少一个参数
修正示例 1:
String formatString = "Hello, %s! Today is %s.";
String result = String.format(formatString, "World", "Sunday"); // 提供两个参数
示例 2:使用可变参数列表(推荐)
如果你不确定需要多少个参数,或者参数数量是动态的,你可以使用可变参数列表。
public class Main {
public static void main(String[] args) {
String formatString = "Hello, %s! Today is %s, and the weather is %s.";
Object[] params = {"World", "Sunday", "sunny"};
String result = String.format(formatString, params); // 这里会报错,因为 String.format 不支持 Object 数组
// 修正为使用可变参数
result = formatWithVarargs(formatString, params);
System.out.println(result);
}
public static String formatWithVarargs(String format, Object... args) {
return String.format(format, args);
}
}
在上面的示例中,我们创建了一个 formatWithVarargs
方法,它接受一个格式化字符串和一个可变参数列表,然后将它们传递给 String.format()
方法。这样,你可以传递任意数量的参数,而无需担心匹配问题。
注意:String.format()
本身并不直接支持 Object[]
数组作为参数,但是你可以通过可变参数列表来间接地实现这一点。
总结
确保你在使用 String.format()
, System.out.printf()
, 或其他格式化方法时,为所有的 %s
占位符提供了相应的参数。如果参数数量是动态的,你可以使用可变参数列表来传递它们。