并非 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: 这讨论了盒装数字类型,例如
Integer
和Float
,如 与原始数字类型相反,例如int
和float
。为了 基元,您的期望是正确的:在boolean ? int : float
中int
被强制为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/