java - 这些 FindBug 消息显示什么?

标签 java findbugs

并非 http://findbugs.sourceforge.net/bugDescriptions.html 中的所有描述我很清楚。当然,我可以研究实现,但如果有人比我更有经验,一些解释和例子会很棒。

  • 当出现问题时,您是否有一些有关 UI_INHERITANCE_UNSAFE_GETRESOURCE 的示例?
  • 在 BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR 中我也没有看到问题。如果一种类型比另一种类型“更大”,例如 int 和 float,则结果是 float。如果它是 Integer 和 Float,那么它的包装器也是 Float。这正是我所期望的。
  • GC_UNRELATED_TYPES 真的有助于查找错误吗?编译器的工作不是检查是否(以给定的示例为例) Foo无法进入Collection<String> .
  • HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS 的含义是否类似于 bla(Foo f){hashtable.put(f);} ,其中“Foo”不可散列? FingBugs 也“看到”子类吗?
  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH 比 NP_ALWAYS_NULL_EXCEPTION 更“错误”?为什么有两种错误情况,并且 NP_NULL_ON_SOME_PATH_EXCEPTION 甚至还有一种?听起来和我很相似。
  • SIO_SUPERFLUOUS_INSTANCEOF 的示例是什么?类似 foo(String s){if (s intenceof String) ... 。这也进行了空检查,但这不是这里的测试......
  • NN_NAKED_NOTIFY。我认为描述不清楚。不需要改变状态。如果我使用 new Object() 等待并通知,我不会更改对象状态。或者state是锁状态?我不明白。
  • SP_SPIN_ON_FIELD。编译器真的会将其移出循环吗?这对我来说没有意义,因为线程外部总是可以更改值。如果变量是 volatile JVM 无法缓存该值。那么什么意思呢?
  • 这就是 STCAL_STATIC_CALENDAR_INSTANCE 和 STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE 或 STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE/STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE 之间的区别吗?
  • 为什么 WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL 中的 XXXX.class 比 getClass() 更好?从子类调用的父类(super class)中的 getClass() 将始终从子类返回 Class 对象,我认为这很好。
  • EQ_UNUSUAL 到底有什么作用?它应该检查参数是否与类本身属于同一类型,但事实并非如此?
  • 您是否遇到过休息问题? SF_SWITCH_FALLTHROUGH 有真正的值(value)吗?对我来说听起来很强大。
  • 不知道 TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK 和 TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK 可能是什么。

最佳答案

我可以根据我的经验和测试对您提到的一些 FindBugs 描述进行评论,而无需查阅 FindBugs 源代码。

  • UI_INHERITANCE_UNSAFE_GETRESOURCE: 如果您将 this.getClass().getResource(...) 与相对 URI 一起使用,则该 URI 为 关于 this 类的解决。当子类驻留在 不同的包,你得到一个子类的资源,你最终会寻找 在不同的地方(相对于子类)。我知道一些示例,其中类通过使用仅包含文件名的相对 URI 调用 getResource() 来查找已知驻留在同一包中的资源。如果该类使用 this.getClass() 而不是 ClassName.class ,并且实际实例是子类,则将找不到资源。

  • BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR: 这讨论了盒装数字类型,例如 IntegerFloat ,如 与原始数字类型相反,例如 intfloat 。为了 基元,您的期望是正确的:在 boolean ? int : floatint 被强制为 float 。但对于包裹的数字,有些东西 意外发生:在 boolean ? Integer : Float 中,Integer 是 拆箱并强制转换为 float 。我本来期望这些物体 不变地返回,就像 ojit_代码。

    boolean b = Boolean.TRUE;
    final Integer i = 123456789;
    final Float f = 1.0f;
    final Number x = b ? i : f;
    System.out.println("wrapped coerced: " + x); // 1.23456792E8
    final Number y = b ? (Number) i : f;
    System.out.println("wrapped uncoerced: " + y); // 123456789
    
  • GC_UNRELATED_TYPES:FindBugs 知道 关于一些收集方法可以 不能针对 Java 1.5 进行泛化,例如 boolean ? (Number)Integer : Float 。这里, 参数必须是类型 Collection.contains(Object) ,因为否则存在 源代码可能会损坏。但任何物体 不确定该集合的类型 不被包含,所以要求 将 Object 包含在 Integer 集合可能是 错误。

    Collection<String> coll = new ArrayList<String>();
    System.out.println(coll.contains(42));
    
  • HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS: ?

  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH: ?

  • SIO_SUPERFLUOUS_INSTANCEOF:?

  • NN_NAKED_NOTIFY:?

  • SP_SPIN_ON_FIELD:如果您在 不是 String 的字段,即 JIT 可以免费优化代码(通过 将读取移出循环)为 只要线程执行循环 产生相同的结果,无需 考虑到存在和 其他线程的 Action 。这就是为什么 有一个 volatile 关键字。据我所知,没有任何例子表明这实际上会导致错误。

  • STCAL_STATIC_CALENDAR_INSTANCE:?

  • WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL: 在 FindBugs 示例中,该方法 在 volatile 上同步到 访问其类的静态成员。 子类将在 子类,所以父类(super class)和 子类可以进入 同步块(synchronized block)同时,因为它们在不同的监视器上同步, 导致竞争条件。

  • EQ_UNUSUAL:?

  • SF_SWITCH_FALLTHROUGH:这对我有帮助 有时,因为我往往会错过 getClass() 。有趣的是,在一次测试中 案例刚刚执行,除此之外我还得到了 FindBugs 消息 消息 SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH。

  • TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK: ?

关于java - 这些 FindBug 消息显示什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2654538/

相关文章:

Java简单计算器错误

java - 我应该设置时区将字符串转换为日期吗?

android - PMD、checkstyle 和 findbugs android 设置

java - 自定义注释以抑制特定的 FindBugs 警告

java - 通过 findbugs 对象使用 Findbugs 测试类

java - 如何解决 EI_EXPOSE_REP2 及其错误原因

java - 哪个 Java 集合允许廉价追加?

java - 在java程序中存储字符串

java - 将 Observable<Single<Object>> 转换为 Single<List<Object>>

ant - SonarQube 分析需要太多时间