问题描述
在软件开发项目中,特别是在处理动态内容生成与呈现至前端界面的过程中,正确运用占位符以确保文本完整性和数据准确性显得尤为重要。不当的占位符管理不仅可能导致语法错误或逻辑混乱,还会引发一系列隐蔽的问题,这些问题往往在程序运行时才暴露出来,增加了调试和维护的复杂度。
示例代码:
@Overridepublic String toString() {return String.format("我国有 %s个省份,这些省份的主食都是%s,对于这类食物的喜爱,让他们找到了多种制作方式:%n%s",provincesNo, food, cookMethod);}
此时,使用静态代码扫描工具,会出现以下提示:
An ‘int’ is expected rather than a String.
原因分析:
静态工具代码扫描工具给出的解释为:
Because printf-style format strings are interpreted at runtime, rather than validated by the Java compiler, they can contain errors that lead to unexpected behavior or runtime errors. This rule statically validates the good behavior of printf-style formats when calling the format(…) methods of java.util.Formatter, java.lang.String, java.io.PrintStream, MessageFormat, and java.io.PrintWriter classes and the printf(…) methods of java.io.PrintStream or java.io.PrintWriter classes.
简单的说,是因为printf样式的格式字符串是在运行时解释的,而不是由Java编译器验证的,所以它们可能包含导致意外行为或运行时错误的错误,这样就会引起bug。
解决方案:
解决方案很简单,只需要保证转义的类型与占位符类型匹配即可。
将例子中的第一个%s改为%d。
@Overridepublic String toString() {return String.format("我国有 %d个省份,这些省份的主食都是%s,对于这类食物的喜爱,让他们找到了多种制作方式:%n%s",provincesNo, food, cookMethod);}
项目实际意义:
针对这个例子本身来说,是非常容易理解并解决的。但是在项目开发过程中,还需要注意两个问题。
1、%n与\n,\r\n的区别
%n和%d、%f等占位符是不一样的, %n不需要指定参数来替换整型输出和浮点型输出的占位符。通过在格式string中使用%n ,可以告诉Java使用由当前系统的行分隔符System.getProperty(“line.separator”)返回的值。
\n 会给你一个unix风格
的行结尾。
\r\n 会给你一个dos风格
的结尾。
%n 会给你一个所运行平台的结尾。
注意:只有在使用System.out.printf()
或System.out.format()
或Formatter
对象时才是正确的。 如果你在System.out.println()
使用%n ,它只会产生一个%n ,而不是一个换行符。
2、常用的占位符及使用方式
占位符 | 说明 | 示例 |
---|---|---|
%s | 字符串类型 | “mingrisoft” |
%c | 字符类型 | ‘m’ |
%b | 布尔类型 | true |
%d | 整数类型(十进制) | 99 |
%x | 整数类型(十六进制) | FF |
%o | 整数类型(八进制) | 77 |
%f | 浮点类型 | 99.99 |
%a | 十六进制浮点类型 | FF.35AE |
%e | 指数类型 | 9.38e+5 |
%g | 通用浮点类型(f和e类型中较短的) | |
%h | 散列码 | |
%% | 百分比类型 | % |
%n | 换行符 | |
%tx | 日期与时间类型(x代表不同的日期与时间转换符) |
参考文章:Java中占位符的超全使用方法
如果这篇博客对大家有所帮助,我希望能得到各位的免费
点赞
和收藏
,作为对我的鼓励和支持。
同时,也请大家在评论区
留下您宝贵的意见和建议,我将非常欢迎。
感谢大家的支持
、评论
和收藏
!!!