当前位置: 首页 > 面试题库 >

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

雍志新
2023-03-14
问题内容

我想确认这是否是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();
        }
    }

第1-3行被标记为UR异常,而重写它以使用局部变量进行迭代是可以的。

想要消除尽可能多的PMD违规行为,但是不得不采用旧的循环构造作为解决方法很不方便。

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


问题答案:

看来您遇到了PMD中的错误。该DataflowAnomalyAnalysis规则似乎并没有捕捉各种可能的变量定义的(另一个例子发现这里)。UR代表“未定义参考”,这显然是错误的。

所以,你可以做什么?

由于问题似乎主要影响规则的UR部分,因此您可以将其禁用并继续使用DU和DD部分。您需要一个相当新的PMD版本才能执行此操作。在您的规则集文件中,禁止显示类似以下内容的UR结果:

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

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

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

在我看来,整个UR检查有点过头,因为编译器将不接受未定义的引用。如今,运行编译器已不再是一件大事。



 类似资料:
  • 问题内容: 我正在尝试将此for循环重写为for每个循环。 这就是我尝试过的 谁能指出我正确的方向?谢谢。 问题答案: 我认为您想得太多… :)

  • 问题内容: 这个问题已经在这里有了答案 : Java的foreach循环是否保留顺序? (2个答案) 4年前关闭。 java for-each循环是否保证如果在列表上调用这些元素,它们将按顺序显示?在我的测试中,它确实存在,但是我似乎找不到任何文档中明确提及的内容。 问题答案: 是。foreach循环将按方法提供的顺序遍历列表。请参阅Iterable接口的文档。 如果查看List的Javadoc,

  • 问题内容: 我遇到了一个问题,在这里我想使用GUI从python程序运行几个命令行功能。我不知道我的问题是否特定于 PyQt4, 或者是否与我对Python代码的错误使用有关。 我希望做的是在GUI上有一个标签,以更改其文本值以通知用户正在执行哪个命令。但是,当我使用 for 循环运行多个命令时,就会出现我的问题。我希望标签在每个循环中进行更新,但是,该程序不是在每个循环中更新GUI标签,而是仅在

  • 我正在尝试为我制作的Set编写一个自定义的迭代器。我对Interface Iterable的合同有点困惑。它有三个方法:Next()、hasNext()和拿下()。我的设置是不可变的,所以我计划为删除()方法抛出一个Unsupport tedoperationException。它也被称为“延迟生成”,即元素不存储在内存中,而是在需要时创建,但这不是这里也不是那里。 Iterator的Next()

  • 我在stackoverflow上看了其他一些答案,但没有找到一个回答我问题的答案。 我有一个变量工具快捷方式,它是由对象数组组成的对象: 我试图为对象中的每个元素(上面对象中的3个元素)返回一些HTML。因为我使用的是带有return语句的for循环,所以只显示每个数组的前几个元素(3个元素中的2个)。如何显示所有三个元素?

  • 问题内容: 我想在Java中编写一个会启动并运行的循环,如下所示: 我要这样做,以免占用系统资源。代码中实际发生的事情是,它进入一个网站并检查是否已完成某件事,如果未完成,则应等待一分钟,直到再次检查为止,然后再继续检查。反正他们在Java中执行此操作吗? 问题答案: 使用。 根据系统计时器和调度程序的精度和准确性,使当前正在执行的线程进入休眠状态(暂时停止执行)达指定的毫秒数。该线程不会失去任何