DuplicateFormatFlagsException 表示同一格式化标志在占位符中被重复指定,如“%--5s”“%++d”“%005d”等;修复需确保每个标志(如-、+、0、#、空格)至多出现一次且不互斥。

DuplicateFormatFlagsException 是 Java 中 java.util.Formatter 相关 API 抛出的运行时异常,表示在格式化字符串(如使用 String.format()、System.out.printf() 或 Formatter 类)时,**同一个格式化标志(flag)被重复指定**,违反了格式化语法规范。
哪些标志不允许重复?
Java 格式化中,部分标志是“互斥”或“单次生效”的,重复出现即报错。常见非法重复包括:
-
-(左对齐)写两次:"%-5s %-5s"合法,但"%--5s"非法 -
+(显示正负号)重复:"%++d"→ 报错 -
0(前导零填充)重复:"%005d"→ 报错 -
(空格占位)重复:"% d"(两个空格)→ 报错 -
#(替代格式,如十六进制加0x)重复:"%#x %#x"合法,但"%##x"非法
典型触发场景
最常发生在拼接格式字符串、模板生成或动态构造 format 参数时,比如:
- 误将标志硬编码重复:
String.format("%-010s", "abc")——-和0冲突(左对齐与补零不可共存) - 字符串拼接出错:
"%" + "-" + "-" + "10s"得到"%--10s" - IDE 自动生成或复制粘贴导致多余符号,如多按了一次
+或空格
如何快速定位和修复?
异常堆栈会明确指出出问题的格式字符串和位置(通常含 `Conversion = 's'` 或类似信息),重点检查:
立即学习“Java免费学习笔记(深入)”;
- 格式占位符(如
%...s、%...d)中 flag 部分是否含重复字符 - 是否混用了冲突标志(如
-和0、+和) - 用 IDE 的字符串高亮或格式校验插件辅助识别(IntelliJ/VS Code Java 插件通常能标红非法格式)
- 简单验证:把格式串单独提取出来,用最小示例测试:
System.out.format("%--5s", "a");
合法格式写法参考
正确用法强调「每个标志至多出现一次」,且遵守组合规则:
- 左对齐 + 最小宽度:
"%-10s" - 右对齐(默认)+ 前导零 + 宽度:
"%08d" - 显示符号 + 十进制:
"%+d" - 十六进制带前缀:
"%#x" - 空格占位正数(负数仍显示
-):"% d"(注意只有一个空格)
不复杂但容易忽略——只要格式串里 flag 不重复、不冲突,就不会触发这个异常。


















