PMD标记为UR异常的每个循环的Java

PMD标记为UR异常的每个循环的Java,java,for-loop,code-analysis,static-analysis,pmd,Java,For Loop,Code Analysis,Static Analysis,Pmd,我想确认这是否是PMD上的错误?如果是的话,我如何提交车票 public static void main(final String[] args) { for (final String string : args) { string.getBytes(); //UR Anomaly } for (int i = 0; i < args.length; i++) { args[i].g

我想确认这是否是PMD上的错误?如果是的话,我如何提交车票

    public static void main(final String[] args) {
        for (final String string : args) {
            string.getBytes(); //UR Anomaly
        }
        for (int i = 0; i < args.length; i++) {
            args[i].getBytes();
        }
    }
publicstaticvoidmain(最终字符串[]args){
for(最终字符串:args){
string.getBytes();//UR异常
}
对于(int i=0;i
第1-3行被标记为UR异常,而重写它以使用局部变量进行迭代是可以的

希望消除尽可能多的PMD冲突,但不得不求助于旧的循环构造作为解决方法是不方便的


虽然存在争议,但我不希望禁用此规则,因为我发现DD和DU异常标记非常有用。

看来您在PMD中遇到了一个错误。该规则似乎没有捕获所有可能类型的变量定义(另一个例子)。 UR代表“未定义的引用”,这显然是不正确的

那么,你能做什么

由于问题似乎主要影响规则的UR部分,您可以禁用它并继续使用DU和DD部分。要做到这一点,您需要一个相当新的PMD版本。在规则集文件中,按如下方式抑制UR结果:


更新:对于PMD 6.+,规则ref已更改(感谢ZuziaKru):



在我看来,整个UR检查有点过头了,因为编译器不会接受未定义的引用。现在,运行编译器已经不是什么大事了。

请参阅适当的PMD规则DataflowAnomalyanAnalysis 经常是。我个人完全疯狂地发现了几乎所有类型的异常:

  • 任何内联声明都会导致UR异常警报。这包括在
    中为
    循环范围定义的变量
  • 若变量在循环范围外定义,并且在某个局部范围结束之前在循环内更改了其值,则DU异常通常会发出警报
  • DD异常通常与检测到的错误UR或DU同时报告。此外,若我们在循环之前设置变量,然后在循环内部更新它的值(用于下一次迭代),则可能会报告。该异常甚至在规则描述中也被引用为不相关

因此,根据我的观点,完全关闭这一错误规则是值得的。

继续托马斯·詹森的回答: 现在,任何查找此规则的人(我使用的是PMD版本6.2.0)都会收到PMD关于不推荐此规则名称的警告。要抑制UR异常,您需要:

<rule ref="category/java/errorprone.xml/DataflowAnomalyAnalysis">
    <properties>
        <property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
    </properties>
</rule>


@bmargulies,我知道String.getBytes()的用法。UR不代表“未使用的结果”。这甚至不是问题所在,我可以简单地处理字符串,但我想要一个SSCCE,其中只包含我感兴趣的UR异常违规标记。@jeremyjjbrown,我发现它很有用,您不能更改迭代器变量。仅供参考,这不是PMD抱怨的原因;)@jeremyjjbrown拥有一个不可变的迭代值(上面代码中的字符串不是迭代器,而是一个迭代值)是很有用的,这样您就知道迭代值(字符串)只设置了一次,不会被意外更改。不过,我明白您的意思。该字符串仅在循环范围内为最终字符串。顺便说一句,PMD错误列表为。关于这个问题还没有什么。您可能需要一个SourceForge帐户来提交新票据。