212

使用 PMD,如果您想忽略特定警告,可以使用// NOPMD忽略该行。

FindBugs 有类似的东西吗?

4

7 回答 7

334

FindBugs 的初始方法涉及 XML 配置文件,即过滤器。这确实不如 PMD 解决方案方便,但 FindBugs 适用于字节码,而不适用于源代码,因此注释显然不是一种选择。例子:

<Match>
   <Class name="com.mycompany.Foo" />
   <Method name="bar" />
   <Bug pattern="DLS_DEAD_STORE_OF_CLASS_LITERAL" />
</Match>

但是,为了解决这个问题,FindBugs 后来引入了另一种基于注释的解决方案(请参阅参考资料SuppressFBWarnings),您可以在类或方法级别使用它(我认为比 XML 更方便)。示例(也许不是最好的,但是,这只是一个示例):

@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
    value="HE_EQUALS_USE_HASHCODE", 
    justification="I know what I'm doing")

请注意,由于 FindBugs 3.0.0SuppressWarnings@SuppressFBWarnings名称与 Java 的SuppressWarnings.

于 2009-12-02T00:34:33.163 回答
29

正如其他人提到的,您可以使用@SuppressFBWarnings注释。如果您不想或不能在代码中添加另一个依赖项,您可以自己将注释添加到代码中,Findbugs 不关心注释在哪个包中。

@Retention(RetentionPolicy.CLASS)
public @interface SuppressFBWarnings {
    /**
     * The set of FindBugs warnings that are to be suppressed in
     * annotated element. The value can be a bug category, kind or pattern.
     *
     */
    String[] value() default {};

    /**
     * Optional documentation of the reason why the warning is suppressed
     */
    String justification() default "";
}

来源:https ://sourceforge.net/p/findbugs/feature-requests/298/#5e88

于 2017-07-06T11:09:36.970 回答
17

这是一个更完整的 XML 过滤器示例(上面的示例本身不起作用,因为它只显示一个片段并且缺少<FindBugsFilter>开始和结束标记):

<FindBugsFilter>
    <Match>
        <Class name="com.mycompany.foo" />
        <Method name="bar" />
        <Bug pattern="NP_BOOLEAN_RETURN_NULL" />
    </Match>
</FindBugsFilter>

如果您使用的是 Android Studio FindBugs 插件,请使用 File->Other Settings->Default Settings->Other Settings->FindBugs-IDEA->Filter->Exclude filter files->Add 浏览到您的 XML 过滤器文件。

于 2014-06-02T15:56:52.580 回答
15

更新 Gradle

dependencies {
    compile group: 'findbugs', name: 'findbugs', version: '1.0.0'
}

找到 FindBugs 报告

file:///Users/your_user/IdeaProjects/projectname/build/reports/findbugs/main.html

查找特定消息

发现错误

导入正确版本的注解

import edu.umd.cs.findbugs.annotations.SuppressWarnings;

直接在有问题的代码上方添加注释

@SuppressWarnings("OUT_OF_RANGE_ARRAY_INDEX")

有关更多信息,请参见此处:findbugs Spring Annotation

于 2016-08-17T06:22:16.783 回答
9

在撰写本文时(2018 年 5 月), FindBugs 似乎已被SpotBugs取代。使用SuppressFBWarnings注解要求您的代码使用 Java 8 或更高版本进行编译,并引入了对spotbugs-annotations.jar.

使用过滤器文件过滤 SpotBugs 规则没有这样的问题。文档在这里

于 2018-05-25T09:08:29.787 回答
7

尽管此处的其他答案是有效的,但它们并不是解决此问题的完整方法。

本着完整性的精神:

您需要在 pom 文件中包含 findbugs 注释 - 它们只是编译时间,因此您可以使用provided范围:

<dependency>
  <groupId>com.google.code.findbugs</groupId>
  <artifactId>findbugs-annotations</artifactId>
  <version>3.0.1</version>
  <scope>provided</scope>
</dependency>

这允许使用@SuppressFBWarnings另一个依赖项提供@SuppressWarnings. 但是,上面的内容更清楚。

然后在方法上方添加注释:

例如

@SuppressFBWarnings(value = "RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE",
        justification = "Scanning generated code of try-with-resources")
@Override
public String get() {
    try (InputStream resourceStream =  owningType.getClassLoader().getResourceAsStream(resourcePath);
         BufferedReader reader = new BufferedReader(new InputStreamReader(resourceStream, UTF_8))) { ... }

这包括错误的名称以及禁用扫描的原因。

于 2020-03-30T15:47:16.067 回答
-8

我将把这个留在这里:https ://stackoverflow.com/a/14509697/1356953

请注意,这适用于java.lang.SuppressWarnings因此无需使用单独的注释。

字段上的@SuppressWarnings 仅抑制为该字段声明报告的 findbugs 警告,而不是与该字段关联的每个警告。

例如,这会抑制“字段只设置为空”警告:

@SuppressWarnings("UWF_NULL_FIELD") 字符串 s = null; 我认为您能做的最好的事情就是将带有警告的代码隔离成最小的方法,然后抑制整个方法的警告。

于 2016-02-04T14:43:43.410 回答