ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java.util.UnknownFormatConversionException: Conversion = 'j' || Conversion = 'D'

2020-11-10 22:34:42  阅读:261  来源: 互联网

标签:Conversion java format 结果 util arg Formatter


执行内容:

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

标签:Conversion,java,format,结果,util,arg,Formatter
来源: https://www.cnblogs.com/niceyoo/p/13956380.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有