JDK1.6正常JRE1.8报错:String.format格式标志不匹配求助
问题分析与解决方案
我之前碰到过类似的版本兼容问题,核心原因是Java 8对字符串格式化的规则做了严格校验,而你用的格式标志和转换符组合在新版本里是不合法的——旧版JDK 1.6可能忽略了这个错误,但JRE 1.8开始直接抛出FormatFlagsConversionMismatchException。
错误原因拆解
你看报错信息里的Conversion = s, Flags = #,这说明你把#标志和字符串转换符s一起用了,但#是专门给数值类型(比如整数、浮点数)设计的:
- 用于显示进制前缀(比如十六进制的
0x) - 强制显示小数点(比如浮点数
3变成3.0)
它和字符串类型s完全不兼容,JDK 1.6可能宽松处理了这个错误,但Java 8开始严格执行格式规则,所以导出Jar包用JRE 1.8运行时就触发了异常。
修正你的padRight方法
从方法名来看,你应该是想把字符串左对齐,右侧补空格到指定长度n,那正确的格式化写法应该移除#标志,改用左对齐的格式符-:
public static String padRight(String s, int n) { // %1$-ns 表示左对齐,用空格填充到n个字符长度 return String.format("%1$-" + n + "s", s); }
如果你的实际需求是右对齐,左侧补空格(相当于padLeft),那直接去掉#和-即可:
public static String padLeft(String s, int n) { return String.format("%1$" + n + "s", s); }
另外,不需要把参数包装成Object[],直接传入字符串s就行,String.format会自动处理参数。
为什么Eclipse里运行正常?
大概率是因为你的Eclipse项目配置的是JDK 1.6的运行环境,编译和运行都遵循旧版本的宽松规则,所以没报错;导出Jar包后用JRE 1.8执行,触发了新版本的严格校验,才暴露了问题。
内容的提问来源于stack exchange,提问作者Nads707
相关产品推荐
相关产品推荐

