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%%'";

博客园:https://www.cnblogs.com/niceyoo

posted @ 2020-11-10 22:23  niceyoo  阅读(2924)  评论(0编辑  收藏  举报