这些FindBug消息显示了什么?

时间:2010-04-16 16:20:53

标签: java findbugs

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

  • 在遇到问题时,您是否有一些UI_INHERITANCE_UNSAFE_GETRESOURCE示例?
  • 在BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR中,我也没有看到问题。如果一个类型比另一个类型“更大”,例如int和float,那么结果是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。我的意见我的描述不清楚。不需要改变国家。如果我使用新的Object()来等待并通知我不改变对象状态。或者说是锁定状态?我不明白。
  • 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()更好?从子类调用的超类中的getClass()将始终从子类返回Class对象,我认为这很好。
  • EQ_UNUSUAL究竟做了什么?它应该检查参数是否与类本身的类型相同但不是吗?
  • 你有过休息的问题吗? SF_SWITCH_FALLTHROUGH有真正的价值吗?听起来很强大。
  • 不知道TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK和TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK是什么。

1 个答案:

答案 0 :(得分:7)

根据我的经验和测试,我可以在不咨询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 : float int被强制为float。但对于包装数字,一些东西 意外发生:在boolean ? Integer : Float中,Integer是 未装箱并强制执行float。我本来期待的对象 没有改变,就像在 boolean ? (Number)Integer : Float

    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那样普及 Collection.contains(Object)。这里, 参数必须是类型 Object,因为否则存在 源代码可能会破坏。但任何对象 不是集合的类型是肯定的 不被包含,所以要求 在...中包含Integer String集合可能是一个 错误。

    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:如果你旋转一个 JIT不是volatile的字段 可以自由地优化代码(通过 将读出移出循环) 只要线程执行循环 产生相同的结果,没有 考虑到存在和 其他线程的动作。这就是为什么 有volatile个关键字。我不知道这会导致一个错误。

  • STCAL_STATIC_CALENDAR_INSTANCE:?

  • WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL: 在FindBugs示例中,该方法 在getClass()上同步 访问其类的静态成员。 子类将同步 子类,所以超类和 子类可以进入 同步块同时因为它们在不同的监视器上同步, 导致竞争状况。

  • EQ_UNUSUAL:?

  • SF_SWITCH_FALLTHROUGH:这对我很有帮助 有时,因为我倾向于错过了 break。有趣的是,在测试中 案件刚刚执行,我得到了除此之外 FindBugs给消息留言 SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH。

  • TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK: