unknownformatconversionexception是java格式化方法抛出的运行时异常,因格式字符串中使用了jdk不识别的转换符(如%z、%q、中文“双”等)导致;需检查每个%后字符是否为合法转换符(如%s、%d、%f),并确保无遗漏%、非法拼接或全角符号混用。

UnknownFormatConversionException 是 Java 中 String.format()、PrintStream.printf() 等格式化方法抛出的运行时异常,表示格式字符串中出现了无法识别的转换符(conversion character),比如写错了占位符、漏写了百分号、或者用了不支持的字母。
常见触发原因
这类异常通常不是代码逻辑问题,而是格式字符串写法错误。以下是最容易踩坑的几种情况:
- 忘记加
%:写成"name: s, age: d"而不是"name: %s, age: %d" - 百分号后跟了非法字符:如
%z、%@、%x1(x1不是合法转换符) - 转义错误:想输出字面量
%却只写了一个,应写成%%;若写成%后无后续字符,也会报错 - 混淆宽度/精度修饰与转换符:如
%5.s(中间多了一个点)、%-0d(标志和宽度顺序错或冲突)
如何快速定位问题
异常堆栈里会明确指出出错位置,例如:
java.util.UnknownFormatConversionException: Conversion = 'q'说明格式串中有个 %q —— 而 q 不是 Java 格式化支持的转换符(合法的有 s、d、f、t、b 等)。
检查方式很简单:逐个核对格式字符串中每个 % 后面紧跟的字符是否属于 Java 官方定义的转换符列表,特别注意大小写(%d 合法,%D 非法)。
安全写法建议
避免手写复杂格式串,尤其在拼接动态内容时:
- 用 IDE 的字符串高亮和实时检查(IntelliJ/VS Code 插件通常能标出非法格式符)
- 对固定格式,优先使用常量定义:
private static final String MSG = "User[%d]: %s"; - 需要拼接多个字段时,拆成多个
%s,再传对应参数,别试图用一个转换符处理多种类型(如不用%s强转数字,而用%d) - 输出
%字符本身时,必须写成%%,不能靠注释或空格绕过
附:常用合法转换符速查
基础类型常用几个就够了:
-
%s:任意对象(调用toString()) -
%d:十进制整数(int/long等) -
%f:浮点数(float/double) -
%t或%T:日期时间(需配合后续字母,如%tY年,%tDMM/dd/yy) -
%b:布尔值(true/false,null 输出false) -
%%:字面量百分号
不熟悉某个组合时,宁可查文档或试运行,也别靠猜测补字母。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











