代码评审——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.mzph.cn/web/31606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP序列化基础概念:深入理解数据存储与传输

PHP序列化是一个关键概念,它允许开发者将复杂的数据结构(如对象、数组等)转换为可存储或可传输的字符串格式。以下是关于PHP序列化基础概念的深入理解: 序列化的定义与目的 定义:序列化是将数据结构或对象状态转换为可…

ASP.NET Core 6.0 多种部署方式

IIS 环境准备和部署 安装并配置 IIS 安装 IIS,在搜索输入并打开 启用或关闭 Windows 功能。 配置IIS 需要配置 ASPNETCore 部署IS 程序包安装 (ASP.NET Core Module v2) Download .NET 6.0 (Linux, macOS, and Windows).NET 6.0 downloads…

人工智能如何助力人才招聘方式改变

尽管全球经济不稳定,但在当今的就业市场上,招聘顶尖人才仍然竞争激烈,企业很难找到优质人才。明智的人才招聘团队会将人工智能融入日常招聘流程当中,借助人工智能工具或智能招聘系统(如大易招聘管理系统)&a…

Kafka第一篇——内部组件概念架构启动服务器zookeeper选举以及底层原理

目录 引入 ——为什么分布式系统需要用第三方软件? JMS 对比 组件 架构推演——备份实现安全可靠 , Zookeeper controller的选举 controller和broker底层通信原理 BROKER内部组件 ​编辑 topic创建 引入 ——为什么分布式系统需要用第三方软件&#…

Java 面试题:对比 Hashtable、HashMap、TreeMap 有什么不同?

在 Java 集合框架中,理解 Hashtable、HashMap 和 TreeMap 之间的区别对于任何希望编写高效代码的开发者来说都是至关重要的。尽管这三个类都用于存储键值对,但它们在特性和使用场景上却有着显著的差异。 Hashtable 是最早实现的哈希表之一,提…

静电式油烟净化器:餐饮业油烟治理的革命性选择

我最近分析了餐饮市场的油烟净化器等产品报告,解决了餐饮业厨房油腻的难题,更加方便了在餐饮业和商业场所有需求的小伙伴们。 在餐饮业,油烟问题一直是业主们头疼的难题。如何有效治理油烟,不仅关乎厨房的清洁,更直接…

收费4980的AI批量混剪,素材技术方法工具配套,详细拆解!

前几天有朋友跟我讲,他说有做旅游卡的,他们收费4980元,给500张卡,送AI批量混剪技术,问我们有没有? 批量混剪技术,这个其他早在2022年的时候我们就已经使用了。有开通抖音企业号的朋友都知道&am…

编译chamfer3D报错

python setup.py install编译chamfer3D报错 出现nvcc fatal : Unsupported gpu architecture ‘compute_86‘的问题,是因为显卡与cuda版本支持的算力不匹配。 nvcc fatal : Unsupported gpu architecture ‘compute_86’ ninja: build stopped: subcommand failed. …

[leetcode 27移除元素]双指针

Problem: 27. 移除元素 文章目录 思路Code 思路 使用双指针 第一个指针,遍历整个数组 第二个指针,当第一个指针遍历到不等于val值时,将其赋给第一个指针所指的位置 并且每赋值一个,第二个指针向后移动一个 最后第二个指针的长度就是结果 Code class Solution {public int remo…

机器人里程计(Odometry)

机器人里程计(Odometry)是机器人定位和导航中的一个关键概念,它涉及到利用传感器数据来估计机器人在环境中的位置和姿态。里程计的基本原理是根据机器人自身动作的反馈来计算其相对于初始位置的位移。这通常包括机器人从一个已知位置开始&…

太牛了!AI换脸数字人,限制解除,免费用!

哈喽,各位小伙伴们好,我是给大家带来各类黑科技与前沿资讯的小武。 今天给大家安利一款美图公司出品的神器,功能限制完全解除,可以免费使用AI换脸数字人、AI提词器、AI脚本、AI抠图、AI清除、AI封面等超多超实用功能,…

抖音商城618好物节消费数据报告发布,带货成交额同比增长300%

6月21日,“抖音商城618好物节”消费数据报告发布,呈现618期间平台全域经营情况及大众消费趋势。 今年618大促活动中,抖音电商投入流量资源和消费券,鼓励商家、达人双向经营货架场景和内容场景,不断激活消费市场。 报…

SEGGER Embedded Studio IDE移植embOS

SEGGER Embedded Studio IDE移植embOS 一、背景介绍二、任务目标三、技术实现3.1 获得embOS3.2 创建SES工程3.2.1 创建初始Solution和Project3.2.2 制作项目文件结构3.2.3 移植embOS库和有关头文件3.2.3.1 头文件3.2.3.2 库文件3.2.3.3 创建RTOSInit.c源文件3.2.3.4 OS_Error.c…

Golang——channel

channel是Go在语言层面提供的协程间的通信方式。通过channel我们可以实现多个协程之间的通信,并对协程进行并发控制。 使用注意: 管道没有缓冲区时,从管道中读取数据会阻塞,直到有协程向管道中写入数据。类似地,向管道…

生产实习Day9 ---- Scala介绍

文章目录 Scala:融合面向对象与函数式编程的强大语言引言Scala与Java的互操作性Scala在大数据处理中的应用Scala的并发编程Scala的学习资源和社区结论 Scala:融合面向对象与函数式编程的强大语言 引言 Scala,全称Scalable Language&#xff…

创新案例|星巴克中国市场创新之路: 2025目标9000家店的挑战与策略

星巴克创始人霍华德舒尔茨:“为迎接中国市场的全面消费复苏,星巴克2025年推进9000家门店计划,将外卖、电商以及家享和外出场景咖啡业务纳入中国新一轮增长计划中。”在面临中国市场同店增长大幅下滑29%背景下,星巴克通过DTC用户体…

使用Java实现哈夫曼编码

前言 哈夫曼编码是一种经典的无损数据压缩算法,它通过赋予出现频率较高的字符较短的编码,出现频率较低的字符较长的编码,从而实现压缩效果。这篇博客将详细讲解如何使用Java实现哈夫曼编码,包括哈夫曼编码的原理、具体实现步骤以…

使用VLLM部署llama3量化版

1.首先去魔塔社区下载量化后的llama3模型 git clone https://www.modelscope.cn/huangjintao/Meta-Llama-3-8B-Instruct-AWQ.git 2.跑起来模型 1)python -m vllm.entrypoints.openai.api_server --model /home/cxh/Meta-Llama-3-8B-Instruct-AWQ --dtype auto --…

【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案

本报告首发于公号“管理咨询宝藏”,如需阅读完整版报告内容,请查阅公号“管理咨询宝藏”。 【管理咨询宝藏134】麦肯锡咨询公司为DB物流公司价格体系优化设计方案 【格式】PDF版本 【关键词】麦肯锡、物流、价格战略、定价体系 【核心观点】 - 与竞争对…

TrainingArguments、ModelArguments、DataArguments参数使用(@dataclass)

文章目录 前言一、@dataclass装饰器说明二、transformers.HfArgumentParser参数使用Demo三、field函数四、llava模型参数1、模型参数设置2、数据参数设置3、训练参数设置4、参数解析5、参数传递6、参数添加前言 理解llava相关参数传递方法,有利于我们对模型修改模块使用参数来…