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


    问题描述

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

    示例代码

    	@Override
        public 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。

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

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

  • 相关阅读:
    kafka的安装和基本操作
    【C++11】智能指针的使用以及模拟实现(shared_ptr,unique_ptr,auto_ptr,weak_ptr)
    创建多层级行索引,创建多层级行索引的DataFrameMultiIndex.from_product()
    Bootstrap Modal
    C++(20):自动join的jthread
    项目管理,看这篇就够了,但一定要实操!
    linux下如何dhcp失败为获取到ip地址,如何设置为一个固定的地址
    【算法】【递归与动态规划模块】纸牌博弈问题(多线路型递归)
    Scala数组常用函数(1)
    【Minecraft开服教程】使用 MCSM 面板一键搭建我的世界服务器,并内网穿透公网远程联机
  • 原文地址:https://blog.csdn.net/moon_ly/article/details/139861198