java.util.UnknownFormatConversionException: Conversion = 'j' || Conversion = 'D' || Conversion = 'Y'
执行内容:
String a = "select * from j_question j where j.status = %s and j.title like '%java%'";
String format = String.format(a, 1);
System.out.println(format);
拼接SQL时,最后需要 format 替换字符串中的 %s 占位符。
预期效果:
select * from j_question j where j.status = 1 and j.title like '%java%'
报错内容:
Conversion = 'j' 或者是 Conversion = 'D' 或者 Conversion = 'Y'
Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = 'j'
at java.base/java.util.Formatter$FormatSpecifier.conversion(Formatter.java:2839)
at java.base/java.util.Formatter$FormatSpecifier.<init>(Formatter.java:2865)
at java.base/java.util.Formatter.parse(Formatter.java:2713)
at java.base/java.util.Formatter.format(Formatter.java:2655)
at java.base/java.util.Formatter.format(Formatter.java:2609)
at java.base/java.lang.String.format(String.java:2897)
错误原因:
String.format() 格式化字符串输出时,任何未明确定义为转换的字符都是非法的,在格式字符串中使用此类字符将导致 UnknownFormatConversionException。
1、先来明确一下 % 的作用:
% 就相当于一种语法格式, % 后面需要跟上需要转换的参数,而参数的取值,无非就如下这些情况:
转换 | 参数类别 | 说明 |
---|---|---|
'b','B' | 常规 | 如果参数 arg 为 null,则结果为 "false"。如果 arg 是一个 boolean 值或 Boolean,则结果为 String.valueOf() 返回的字符串。否则结果为 "true"。 |
'h','H' | 常规 | 如果参数 arg 为 null,则结果为 "null"。否则,结果为调用 Integer.toHexString(arg.hashCode()) 得到的结果。 |
's', 'S' | 常规 | 如果参数 arg 为 null,则结果为 "null"。如果 arg 实现 Formattable,则调用 arg.formatTo。否则,结果为调用 arg.toString() 得到的结果。 |
'c','C' | 字符 | 结果是一个 Unicode 字符 |
'd' | 整数 | 结果被格式化为十进制整数 |
'o' | 整数 | 结果被格式化为八进制整数 |
'x', 'X' | 整数 | 结果被格式化为十六进制整数 |
'e','E' | 浮点 | 结果被格式化为用计算机科学记数法表示的十进制数 |
'f' | 浮点 | 结果被格式化为十进制数 |
'g','G' | 浮点 | 根据精度和舍入运算后的值,使用计算机科学记数形式或十进制格式对结果进行格式化。 |
'a','A' | 浮点 | 结果被格式化为带有效位数和指数的十六进制浮点数 |
't', 'T' | 日期/时间 | 日期和时间转换字符的前缀。请参阅日期/时间转换。 |
'%' | 百分比 | 结果为字面值 '%' ('"u0025') |
'n' | 行分隔符 | 结果为特定于平台的行分隔符 |
2、再来解释一下什么是未明确定义的字符:
通过上面这些取值我们知道了,%[参数] 顶多就 %b、%B、%h、%H、%s、%S ... %%、%n 等。
而在需要转换的字符串中有这么一段 %java%
,也就是他会把 %j
当做一个转换参数,很显然上边的取值中就没有 %j
嘛,所以就报错了,就如同错误内容一样:Conversion = 'j'
那么需要用到 % 的地方怎么办呢?
解决方法:
通过上边的 % 取值发现,%%
最终的输出结果为一个 %,所以解决方法就是使用双重 %,
比如之前的 %java%
,需要修改为 %%java%%
String a = "select * from j_question j where j.status = %s and j.title like '%%java%%'";