Sonar Java-lambda表达式中的格式字符串导致';一个';int';是预期的,而不是预期的!延迟类型';关键问题

Sonar Java-lambda表达式中的格式字符串导致';一个';int';是预期的,而不是预期的!延迟类型';关键问题,java,sonarqube,string-formatting,Java,Sonarqube,String Formatting,Sonar Java插件包含一条规则 Printf样式的格式字符串不应在 运行时(squid:S2275) 此规则会产生关键的声纳问题: 应为“int”而不是“a”!延迟类型 当lambda函数中的一个或多个正在格式化的参数位于lambda的参数列表中时,如果遇到字符串格式化表达式,则会引发这些问题。例如: private final PercentTracker<ExtractDataTuple> zeroDurationCounter = new Perc

Sonar Java插件包含一条规则

Printf样式的格式字符串不应在 运行时(squid:S2275)

此规则会产生关键的声纳问题:

应为“int”而不是“a”!延迟类型

当lambda函数中的一个或多个正在格式化的参数位于lambda的参数列表中时,如果遇到字符串格式化表达式,则会引发这些问题。例如:

    private final PercentTracker<ExtractDataTuple> zeroDurationCounter =
        new PercentTracker<>(
            ExtractDataTuple::startTimeSameAsEndTime,
            (hitCount, total, percent) -> LOG.info(String.format(
               "Emitted %d/%d segments with no duration  %,.2f%%", hitCount, total, percent))
        );
private final percentracker zeroDurationCounter=
新百分比跟踪器(
ExtractDataTuple::StartTimesMeaSendTime,
(命中率、总数、百分比)->LOG.info(String.format(
“已发射%d/%d段,无持续时间%,.2f%%”,命中率,总数,百分比)
);
tracker类构造函数的第三个参数是一个函数,参数int、int和float返回void。这是通过lambda提供的


声纳规则是否应该确定lambda参数的类型?如果没有,我如何通过更改代码来解决声纳问题?如果我错了,请纠正我(长期C#编码器,Java新手),但我似乎无法显式指定lambda的参数类型。我是否应该将format调用中的参数正式转换为format说明符指定的类型?

您是否可以确定您使用的是哪个版本的java插件?这是语义分析中的一个缺陷(类型推断很难正确获得),因此变量的类型没有正确解析。(因此,!DeferedType!而不是int)Java插件的版本是3.14。那么我建议您升级到Java analyzer的最新版本(编写时为4.1,即将发布4.2),因为在类型推断方面,特别是在lambdas和方法引用方面,已经做了很多改进。好的,我们将尝试最新版本。不确定我们是否可以运行所需版本的Sonar来支持最新的Java插件,但这不是这里要讨论的问题。很高兴报告Sonar 5.6.1和Java插件4.2,我文章中报告的问题不再存在。