这些FindBug消息显示了什么?

Chr*_*oom 0 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);}F'哪个不可清洗?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.这真的会发生,编译器会将其移出循环吗?这对我来说没有意义,因为从外部线程可以随时更改值.如果变量是volatileJVM无法缓存的值.那是什么意思?
  • 这是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是什么.

Chr*_*rau 8

根据我的经验和测试,我可以在不咨询FindBugs源代码的情况下评论您提到的一些FindBugs描述.

  • UI_INHERITANCE_UNSAFE_GETRESOURCE:如果您使用this.getClass().getResource(...)相对URI,则该URI将根据类进行解析this.当子类驻留在不同的包中并且您获得子类的资源时,您最终会查看不同的位置(相对于子类).我知道一个类通过getResource()使用仅包含文件名的相对URI 调用来查找已知驻留在同一个包中的资源的示例.如果该类this.getClass()代替使用ClassName.class,而实际实例是子类,则找不到该资源.

  • BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR:这是关于盒装数字类型,比如IntegerFloat,而不是原始数字类型,比如intfloat.对于原语,你的预期是正确的:在boolean ? int : floatint被胁迫float.但对于包装数字,会发生意外情况:In 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
    
    Run Code Online (Sandbox Code Playgroud)
  • GC_UNRELATED_TYPES:FindBugs知道一些无法为Java 1.5生成的集合方法,比如 Collection.contains(Object).这里,参数必须是类型 Object,因为否则现有的源代码可能会中断.但是任何不属于集合类型的对象肯定不会被包含,因此要求对集合Integer中的a进行 String包含可能是一个错误.

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

  • NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH :?

  • SIO_SUPERFLUOUS_INSTANCEOF :?

  • NN_NAKED_NOTIFY :?

  • SP_SPIN_ON_FIELD:如果你旋转一个不是的字段,volatile只要执行循环的线程产生相同的结果,JIT就可以自由地优化代码(通过移出循环读出),而不考虑存在和其他线程的动作.这就是为什么有一个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 :?