Bug: Load of known null value
Pattern id: NP_LOAD_OF_KNOWN_NULL_VALUE, type: NP, category: STYLE
The variable referenced at this point is known to be null due to an earlier check against null. Although this is valid, it might be a mistake (perhaps you intended to refer to a different variable, or perhaps the earlier check to see if the variable is null should have been a check to see if it was nonnull).
解释:
Node为null,还进一步调用它上面的方法,除非你能保证当node为null的时候
isDeleteSingleObject为false,否则很可能发生空指针异常,我估计作者是第二个if是想判断 node != null吧。 解决方法:
努力找到原作者,当面询问其用意。
44. EI_EXPOSE_REP2
案例 DO类
Bug: SingleNePollConfigDialog.collectValues(Hashtable) may expose internal representation by storing an externally mutable object into SingleNePollConfigDialog.values Pattern id: EI_EXPOSE_REP2, type: EI2, category: MALICIOUS_CODE
解释:
参数values保存在当前线程的执行栈中,而this.values保存在堆上,它们同时指向同一个对 象,对参数values的任何操作都会影响到this.values,如果你知道这一点,而且本意就是这 样的,那么你可以忽略上面这些话,但是下面这些话你应该好好听听。
这是一段正确的代码,但不是一段可维护性强、可理解性强的代码,参数代表操作的条件, 它们应该是只读的,我们不应该对它直接进行操作或者赋值。 解决方法:
如果把上面对参数values的操作都改成this.values,我相信你和你的同事都会觉得这样的代 码更加清晰。
}
案例二 DO类
Bug: SingleNePollConfigDialog.collectValues(Hashtable) may expose internal representation by storing an externally mutable object into SingleNePollConfigDialog.values Pattern id: EI_EXPOSE_REP2, type: EI2, category: MALICIOUS_CODE
This code stores a reference to an externally mutable object into the internal representation of the object. If instances are accessed by untrusted code, and unchecked changes to the mutable object would
compromise security or other important properties, you will need to do something different. Storing a copy of the object is better approach in many situations.
翻译愿意:
此代码存储到一个到对象的内部表示外部可变对象的引用。如果实例是由不受信任的代码, 并以可变对象会危及安全或其他重要的属性选中更改访问,你需要做不同的东西。存储一个 对象的副本,在许多情况下是更好的办法。
解释:
DO类实例产生之后,里面包含的Date不是原始数据类型,导致其gmtCrate属性不光是
set方法可以改变其值,外部引用修改之后也可能导致gmtCreate 被改变,会引起可能的不 安全或者错误。
这个是一个不好的实践,不过我们应用里面DO都是比较简单使用,不太会出现这种情况。
解决方法:
修改成:
public Date getGmtCreate() {
return new Date(this.gmtCreate.getTime()); //正确值 }
45. EI_EXPOSE_REP
Bug: temsLoader.getItemsWithPriority() may expose internal representation by returning ItemsLoader.m_htItemsWithPriority
Pattern id: EI_EXPOSE_REP, type: EI, category: MALICIOUS_CODE 解释:
刚开始一看挺纳闷的,这个方法有什么问题吗?后来仔细看一下,发现返回值都有一个特点, 它们都是集合数组之类的,我想findBugs的本意是,某些数据集合不应该直接对外提供public 返回方法,即使表面上提供了get方法,但实际上可以任意修改里面的数据。 解决方法:
如果你确定这些数据集合不应该被外界修改,那么对于基本数据类型,你提供get方法即可, 对于引用,get方法里的返回值应该是数据的拷贝。
46. NP_NULL_PARAM_DEREF
Bug: Method call passes null for nonnull parameter of queryScriptData(ObjService) Pattern id: NP_NULL_PARAM_DEREF, type: NP, category: CORRECTNESS 解释:
当getAllListFiles方法发生了任何异常(checked和unchecked),allFiles都为null,关键是在 queryScriptData方法里,并没有对参数是否为null进行判断,它直接调用了参数对象上面的 方法,这肯定会发生空指针异常。
一个优秀的程序员,在过马路时都要向两边看一下,在写一个方法时,首先要考虑的就是对 方法参数的有效性判断。 解决方法:
在queryScriptData方法里对参数进行有效性判断。
46. SBSC_USE_STRINGBUFFER_CONCATENATION
Bug: Method InitDBPoolParaTask.execute() concatenates strings using + in a loop Pattern id: SBSC_USE_STRINGBUFFER_CONCATENATION, type: SBSC, category: PERFORMANCE
The method seems to be building a String using concatenation in a loop. In each iteration, the String is converted to a
StringBuffer/StringBuilder, appended to, and converted back to a String. This can lead to a cost quadratic in the number of iterations, as the growing string is recopied in each iteration.
Better performance can be obtained by using a StringBuffer (or StringBuilder in Java 1.5) explicitly.
解释:
每次循环里的字符串+连接,都会新产生一个string对象,在java中,新建一个对象的代价 是很昂贵的,特别是在循环语句中,效率较低。 解决方法:
利用StringBuffer或者StringBuilder重用对象。