我想确认这是否是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异常标记为有用。
答案 0 :(得分:14)
您似乎遇到了PMD中的错误。 DataflowAnomalyAnalysis规则似乎没有捕获所有可能的变量定义(找到另一个示例here)。 UR代表&#34;未定义的引用&#34;,这显然是不正确的。
那么,你能做什么?
由于问题似乎主要影响规则的UR部分,因此您可以禁用它并继续使用DU和DD部分。你需要一个相当新版本的PMD才能做到这一点。在规则集文件中,抑制UR结果如下:
<rule ref="rulesets/java/controversial.xml/DataflowAnomalyAnalysis">
<properties>
<property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
</properties>
</rule>
更新:对于PMD 6. +,规则引用已更改(感谢ZuziaKru):
<rule ref="category/java/errorprone.xml/DataflowAnomalyAnalysis">
<properties>
<property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
</properties>
</rule>
在我看来,整个UR检查有点过头了,因为编译器不会接受未定义的引用。而现在,运行编译器不再是一件大事了。
答案 1 :(得分:4)
请参阅相应的PMD规则DataflowAnomalyAnalysis 经常是considered controversial。我个人完全疯狂地发现了几乎任何类型的异常现象:
for
循环范围中定义的变量。因此,根据我的观点,完全可以关闭这个错误的规则。
答案 2 :(得分:0)
扩展托马斯·詹森的答案: 如今,任何人(我使用的是PMD版本6.2.0)都会从PMD收到有关此规则名称已弃用的警告。要抑制UR异常,您需要执行以下操作:
<rule ref="category/java/errorprone.xml/DataflowAnomalyAnalysis">
<properties>
<property name="violationSuppressRegex" value="^Found 'UR'-anomaly.*"/>
</properties>
</rule>