当前位置: 首页 > news >正文

代码评审——Java占位符%n的处理

问题描述

在软件开发项目中,特别是在处理动态内容生成与呈现至前端界面的过程中,正确运用占位符以确保文本完整性和数据准确性显得尤为重要。不当的占位符管理不仅可能导致语法错误或逻辑混乱,还会引发一系列隐蔽的问题,这些问题往往在程序运行时才暴露出来,增加了调试和维护的复杂度。

示例代码:

	@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中占位符的超全使用方法

如果这篇博客对大家有所帮助,我希望能得到各位的免费点赞收藏,作为对我的鼓励和支持。
同时,也请大家在评论区留下您宝贵的意见和建议,我将非常欢迎。
感谢大家的支持评论收藏!!!

http://www.lryc.cn/news/384130.html

相关文章:

  • 超低排放标准
  • Day15 —— 大语言模型简介
  • 使用了CDN,局部访问慢,如何排查
  • 谈谈SQL优化
  • 力扣随机一题 6/26 哈希表 数组 思维
  • 自动化办公04 使用pyecharts制图
  • 【Elasticsearch】在es中实现mysql中的FIND_IN_SET查询条件
  • 内网一键部署k8s-kubeshpere,1.22.12版本
  • Python数据分析第一课:Anaconda的安装使用
  • 数据结构——
  • 微信小程序建议录音机
  • 双指针:移动零
  • 图像亮度和对比度的调整
  • Linux加固-权限管理_chattr之i和a参数
  • windows10/win11截图快捷键 和 剪贴板历史记录 快捷键
  • 上海计算机考研避雷,25考研慎报
  • 第九次作业
  • A股探底回升,跑出惊天大阳,你们知道为什么吗?
  • jenkins nginx自动化部署 php项目
  • 海外代理IP哪个可靠?如何测试代理的稳定性?
  • MySQL之可扩展性(四)
  • JupyterLab使用指南(三):JupyterLab的Cell详细介绍
  • solidity智能合约如何实现跨合约调用函数
  • 关于Vue2的生命周期会问到哪些面试题?
  • 尚品汇-(七)
  • 【Python datetime模块精讲】:时间旅行者的日志,精准操控日期与时间
  • keepalived 服务高可用(简约版)
  • 【前端】Vue项目和微信小程序生成二维码和条形码
  • 同时使用接口文档swagger和knife4j
  • Compose - 权限申请