有没有办法忽略一个FindBugs警告?

时间:2009-12-02 00:21:51

标签: java warnings findbugs suppress-warnings

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

FindBugs有类似的东西吗?

7 个答案:

答案 0 :(得分:279)

FindBugs初始方法涉及XML配置文件aka filters。这实际上不如PMD解决方案方便,但FindBugs适用于字节码,而不是源代码,因此评论显然不是一种选择。例如:

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

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

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

请注意,由于名称与Java的SuppressWarnings发生冲突,因此不推荐使用FindBugs 3.0.0 @SuppressFBWarnings而使用SuppressWarnings

答案 1 :(得分:18)

正如其他人所提到的,您可以使用@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

答案 2 :(得分:15)

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

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

如果您使用的是Android Studio FindBugs插件,请使用文件 - >其他设置 - >默认设置 - >其他设置 - > FindBugs-IDEA-&gt;过滤器 - &gt;排除浏览到您的XML过滤器文件过滤文件 - &gt;添加。

答案 3 :(得分:8)

更新Gradle

FATAL EXCEPTION: main
E/AndroidRuntime(21895): Process: com.app, PID: 21895
E/AndroidRuntime(21895): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.app/com.app.AppActivity}: android.view.InflateException: Binary XML file line #48: Error inflating class <unknown>
E/AndroidRuntime(21895):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2520)
E/AndroidRuntime(21895):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2600)
E/AndroidRuntime(21895):    at android.app.ActivityThread.access$800(ActivityThread.java:177)
E/AndroidRuntime(21895):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1469)
E/AndroidRuntime(21895):    at android.os.Handler.dispatchMessage(Handler.java:111)
E/AndroidRuntime(21895):    at android.os.Looper.loop(Looper.java:194)
E/AndroidRuntime(21895):    at android.app.ActivityThread.main(ActivityThread.java:5622)
E/AndroidRuntime(21895):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(21895):    at java.lang.reflect.Method.invoke(Method.java:372)
E/AndroidRuntime(21895):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
E/AndroidRuntime(21895):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
E/AndroidRuntime(21895): Caused by: android.view.InflateException: Binary XML file line #48: Error inflating class <unknown>
E/AndroidRuntime(21895):    at android.view.LayoutInflater.createView(LayoutInflater.java:633)
E/AndroidRuntime(21895):    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:743)
E/AndroidRuntime(21895):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
E/AndroidRuntime(21895):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
E/AndroidRuntime(21895):    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
E/AndroidRuntime(21895):    at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
E/AndroidRuntime(21895):    at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
E/AndroidRuntime(21895):    at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
E/AndroidRuntime(21895):    at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:420)
E/AndroidRuntime(21895):    at android.app.Activity.setContentView(Activity.java:2195)
E/AndroidRuntime(21895):    at com.app.AppActivity.onCreate(AppActivity.java:185)
E/AndroidRuntime(21895):    at android.app.Activity.performCreate(Activity.java:6120)
E/AndroidRuntime(21895):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1112)
E/AndroidRuntime(21895):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2467)
E/AndroidRuntime(21895):    ... 10 more
E/AndroidRuntime(21895): Caused by: java.lang.reflect.InvocationTargetException
E/AndroidRuntime(21895):    at java.lang.reflect.Constructor.newInstance(Native Method)
E/AndroidRuntime(21895):    at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
E/AndroidRuntime(21895):    at android.view.LayoutInflater.createView(LayoutInflater.java:607)
E/AndroidRuntime(21895):    ... 23 more
E/AndroidRuntime(21895): Caused by: android.content.res.Resources$NotFoundException: Resource ID #0x7f0a002a
E/AndroidRuntime(21895):    at android.content.res.Resources.getValue(Resources.java:1457)
E/AndroidRuntime(21895):    at android.content.res.Resources.getColor(Resources.java:1051)
E/AndroidRuntime(21895):    at com.app.ui.CirclePageIndicator.<init>(CirclePageIndicator.java:82)
E/AndroidRuntime(21895):    at com.app.ui.CirclePageIndicator.<init>(CirclePageIndicator.java:72)

找到FindBugs报告

  

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

查找特定消息

find bugs

导入正确版本的注释

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

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

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

有关详细信息,请参阅此处:findbugs Spring Annotation

答案 4 :(得分:5)

在撰写本文时(2018年5月),FindBugs似乎已被SpotBugs取代。使用SuppressFBWarnings注释需要使用Java 8或更高版本编译代码,并在spotbugs-annotations.jar上引入编译时依赖性。

使用过滤器文件过滤SpotBugs规则没有此类问题。文档为here

答案 5 :(得分:2)

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

本着完整性的精神:

您需要在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))) { ... }

这不仅包括 bug 的名称,还包括您禁用其扫描的原因。

答案 6 :(得分:-6)

我要在这里留下这个:https://stackoverflow.com/a/14509697/1356953

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

  

字段上的@SuppressWarnings仅抑制findbugs警告   为该领域声明报告,而不是与之相关的每一个警告   那个领域。

     

例如,这会抑制&#34;字段只设置为null&#34;   警告:

     

@SuppressWarnings(&#34; UWF_NULL_FIELD&#34;)String s = null;我认为最好的   你可以做的是将代码与警告隔离成最小的   你可以使用方法,然后在整个方法上禁止警告。