illegalformatconversionexception 是 runtimeexception 子类,因格式说明符与参数类型不匹配(如 %d 传 string)抛出;消息含“期望类型 != 实际类型”,需严格匹配占位符与参数类型。

IllegalFormatConversionException 是 Java 中的 非受检异常(RuntimeException 子类),在使用 String.format()、System.out.printf() 或 Formatter 进行字符串格式化时,**格式说明符与对应参数类型不匹配**时抛出。
常见触发场景
本质是「用错了占位符」。例如:
- 用
%d(期望整数)去格式化一个String对象 - 用
%s格式化null(虽然通常不会直接报这个异常,但配合某些修饰符或自定义格式器可能间接引发) - 用
%f格式化一个未实现Formattable的非数字对象(如自定义类) - 用
%tB(期望日期时间类)传入Integer
典型错误示例与修复
以下代码会抛出 IllegalFormatConversionException:
String s = String.format("年龄:%d", "二十"); // %d 要求 int,却给了 String
→ 报错:`java.util.IllegalFormatConversionException: d != java.lang.String`
正确写法:
- 改占位符:`String.format("年龄:%s", "二十")`
- 或改参数:`String.format("年龄:%d", 20)`
如何避免和排查
这类异常编译期不检查,全靠运行时暴露,所以需主动预防:
- 保持占位符与参数类型严格一致:`%d`/`%o`/`%x` → 整数类;`%f`/`%e` → 浮点类;`%s` → 任意对象(调用
toString());`%t` → 日期时间类 - 对动态参数做类型校验(尤其从外部输入或反射获取的值),必要时显式转换或兜底为
%s - IDE 通常会在编辑时标出明显类型不匹配(如 IntelliJ 在 format 字符串下划红线),别忽略提示
- 单元测试覆盖边界情况,比如传入
null、包装类型为null(如Integer null传给%d会 NPE,不是本异常,但易混淆)
注意它和类似异常的区别
别和这些异常搞混:
-
NullPointerException:参数为null且格式符不支持(如%d遇到null) -
IllegalFormatException:格式字符串本身非法(如%后跟不认识的字符%z) -
MissingFormatArgumentException:占位符多于参数个数
它的异常消息里一定包含类似 xxx != yyy 的结构,左边是期望类型,右边是实际类型,这是最直接的诊断线索。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











