1、".equals()" should not be used to test the values of "Atomic" classes.
bug 主要
不要使用equals方法对AtomicXXX进行是否相等的判断
Atomic变量永远只会和自身相等,Atomic变量没有覆写equals()方法.
2、"=+" should not be used instead of "+="
bug 主要
"=+" 与 "=+" 意义不同
a =+ b;虽然正确但写法不合规,应写成 a = +b;
3、"@NonNull" values should not be set to null
bug 次要
标注非空假定非空且在使用之前不进行非空检查,设置为空会导致空指针异常
4、"BigDecimal(double)" should not be used
bug 主要
因为浮点的不精确,可能使用BigDecimal(double)得不到期望的值
5、"compareTo" results should not be checked for specific values
bug 次要
compareTo可能返回不是具体的值(除0外),建议用 >0、<0、=0
6、"compareTo" should not return "Integer.MIN_VALUE"
bug 次要
compareTo只代表一个不等标识,不代表不等的程度,应返回-1,0,1标识即可
7、"Double.longBitsToDouble" should not be used for "int"
bug 主要
Double.longBitsToDouble返回给定的位所代表的double值,需要一个64位的long类型参数.
8、 "equals" method overrides should accept "Object" parameters
bug 主要
equals作为方法名应该仅用于重写Object.equals(Object)来避免混乱.
9、 "equals(Object obj)" should test argument type
bug 次要
要比较obj的class type是否一样
10、"equals" methods should be symmetric and work for subclasses
bug 次要
equals应是对等并且在有子类参与时能正常工作
11、"equals(Object obj)" and "hashCode()" should be overridden in pairs
bug 次要
成对重写
12、"Externalizable" classes should have no-arguments constructors
bug 主要
Externalizable(可序列化与返序列化)类应该有无参构造器
13、"getClass" should not be used for synchronization
bug 主要
{synchronized (this.getClass())} 错误 子类继承此方法时不能做到同步
{synchronized (MyClass.class)} 正确
14、"hashCode" and "toString" should not be called on array instances
bug 主要
使用Arrays.toString(args)和Arrays.hashCode(args)代替.
15、"instanceof" operators that always return "true" or "false" should be removed
bug 主要
16、"InterruptedException" should not be ignored
bug 主要
try {
while (true) {
// do stuff
}
}catch (InterruptedException e) {
LOGGER.log(Level.WARN, "Interrupted!", e);
// Restore interrupted state...
Thread.currentThread().interrupt();
}
17、"Iterator.hasNext()" should not call "Iterator.next()"
bug 主要
18、"Iterator.next()" methods should throw "NoSuchElementException"
bug 次要
public String next(){
if(!hasNext()){
throw new NoSuchElementException();
}
...
}
19、"notifyAll" should be used
bug 主要
notify可能不能唤醒正确的线程,notifyAll代之。
20、"null" should not be used with "Optional"
bug 主要
把判空包装起来使用而不直接使用!=null
21、"PreparedStatement" and "ResultSet" methods should be called with valid indices
bug 阻断
PreparedStatement与ResultSet参数设置与获取数据由序号1开始而非0
22、"read" and "readLine" return values should be used
bug 主要
BufferedReader.readLine(), Reader.read()及子类中的相关方法都应该先存储再比较
buffReader = new BufferedReader(new FileReader(fileName));
String line = null;
while ((line = buffReader.readLine()) != null) {
// ...
}
23、"runFinalizersOnExit" should not be called
bug 严重
JVM退出时不可能运行finalizers,System.runFinalizersOnExit 和 Runtime.runFinalizersOnExit可以在jvm退出时运行但是因为他们不安全而弃用.
正确用法:
Runtime.addShutdownHook(new Runnable() {
public void run(){
doSomething();
}
});
24、"ScheduledThreadPoolExecutor" should not have 0 core threads
bug 严重
java.util.concurrent.ScheduledThreadPoolExecutor由属性corePoolSize指定线程池大小,如果设置为0表示线程执行器无线程可用且不做任何事.
25、"Serializable" inner classes of non-serializable classes should be "static"
bug 次要
序列化非静态内部类将导致尝试序列化外部类,如果外部类不是序列化类,会产生运行时异常,内部类静态化会避免这种情况
26、"SingleConnectionFactory" instances should be set to "reconnectOnException"
bug 主要
使用Spring SingleConnectionFactory而不启用reconnectOnException设置当连接恶化将阻止自动连接恢复。
27、"StringBuilder" and "StringBuffer" should not be instantiated with a character
bug 主要
StringBuffer foo = new StringBuffer('x'); 错 equivalent to StringBuffer foo = new StringBuffer(120);
StringBuffer foo = new StringBuffer("x"); 对
28、 "super.finalize()" should be called at the end of "Object.finalize()" implementations
bug 严重
protected void finalize() {
releaseSomeResources();
super.finalize(); //调用,最后调用
}
29、"toArray" should be passed an array of the proper type
bug 次要
toArray()无参且强制类型转换会产生运行时异常,应传入一个合适的类弄作参数
public String [] getStringArray(List<String> strings) {
return strings.toArray(new String[0]);
}
30、"toString()" and "clone()" methods should not return null
bug 主要
可返回""
31、 "wait" should not be called when multiple locks are held
bug 阻断
32、 "wait", "notify" and "notifyAll" should only be called when a lock is obviously held on an object
bug 主要
先要获得对象锁才能进行上述操作
private void removeElement() {
synchronized(obj) {
while (!suitableCondition()){
obj.wait();
}
... // Perform removal
}
}
or
private synchronized void removeElement() {
while (!suitableCondition()){
wait();
}
... // Perform removal
}
33、"wait(...)" should be used instead of "Thread.sleep(...)" when a lock is held
bug 阻断
当持有锁的当前线程调用Thread.sleep(...)可能导致性能和扩展性问题,甚至死锁因为持有锁的当前线程已冻结.合适的做法是锁对象wait()释放锁让其它线程进来运行.
34、A "for" loop update clause should move the counter in the right direction
bug 主要
检查for循环下标递增或递减正确
35、All branches in a conditional structure should not have exactly the same implementation
bug 主要
分支中不应该有相同的实现
36、Blocks should be synchronized on "private final" fields or parameters
bug 主要
synchronized同步块应该锁在private final fields或parameters对象上,因为同步块内非final锁对象可能改变导致其它线程进来运行.
37、Boxing and unboxing should not be immediately reversed
bug 次要
自动拆箱和装箱不需手动转换
38、Child class methods named for parent class methods should be overrides
bug 主要
以下情况不是重写:
a、父类方法是static的而子类方法不是static的
b、子类方法的参数或返回值与父类方法不是同一个包
c、父类方法是private
为了不产生混乱,不要与父类方法同名
39、Classes extending java.lang.Thread should override the "run" method
bug 主要
线程类应该重写run方法
40、Classes should not be compared by name
bug 主要
不要用类名称比较类是否相同,而用instanceof或者Class.isAssignableFrom()进行底动类型比较
41、Classes that don't define "hashCode()" should not be used in hashes
bug 主要
没有定义hashCode()方法的类不能作为hash集合中的键值,因为equal相同的实例对像可能返回不同的hash值.
42、Collections should not be passed as arguments to their own methods
bug 主要
集合实例不应该作为参数被传给集合实你还自已的方法中
43、Conditionally executed blocks should be reachable
bug 主要
条件执行块应该可达
44、Constructor injection should be used instead of field injection
bug 主要
构造器注入应该替代属性注入(非Spring framework)
因为任何非Spring framework实例化而是通过构造器实例化的实例不能注入属性,这样公有的构造器实化化后可能产生NullPointerException,除非所有的构造器都是私有的
45、Consumed Stream pipelines should not be reused
bug 主要
流不应该重用
46、Custom resources should be closed
bug 阻断
资源应该关闭
47、Custom serialization method signatures should meet requirements
bug 主要
自定义类序列化方法签名应该合法
49、Dependencies should not have "system" scope
bug 严重
maven依赖不要在system scope
50、Dissimilar primitive wrappers should not be used with the ternary operator without explicit casting
bug 主要
不同的原始包装类如果没有明确的类转换不能用于三元操作中
51、Double Brace Initialization should not be used
bug 次要
双构造初始不要用
Map source = new HashMap(){{ // Noncompliant
put("firstName", "John");
put("lastName", "Smith");
}};
此操作如一个anonymous inner class,如果anonymous inner class返回且被其它对象引用,可能产生memory leaks,既使不产生memory leaks也会让大多维护者感到迷惑
52、Double-checked locking should not be used
bug 阻断
重复检查的锁块不要使用
public static Resource getInstance() {
if (resource == null) {
synchronized (DoubleCheckedLocking.class) {
if (resource == null)
resource = new Resource();
}
}
return resource;
}
应
public synchronized static Resource getInstance() {
if (resource == null)
resource = new Resource();
return resource;
}
53、Equals Hash Code
bug 严重
成对重写equals()与hashCode()
54、Exception should not be created without being thrown
bug 主要
不被抛出的异常不要创建
55、Expressions used in "assert" should not produce side effects
bug 主要
assert表达式不要产生负影响,不要改变数据状态
56、Failed unit tests should be fixed
bug 主要
失败的单元测试应该尽快解决掉
57、Floating point numbers should not be tested for equality
bug 主要
浮点数不要进行比较
58、Getters and setters should be synchronized in pairs
bug 主要
get与set应该成对进行同步操作
59、Identical expressions should not be used on both sides of a binary operator
bug 主要
相同的表达式不要作为二进制操作的操作数使用,应该简化
60、Inappropriate "Collection" calls should not be made
bug 主要
正确使用集合元素类型
61、Inappropriate regular expressions should not be used
bug 主要
正确使用正则表达式
62、Intermediate Stream methods should not be left unused
bug 主要
中间流应该被使用
63、Ints and longs should not be shifted by zero or more than their number of bits-1
bug 次要
整型与长整型位移操作数应该价于1与类型占位数-1
64、Invalid "Date" values should not be used
bug 主要
正确使用日期
65、Jump statements should not occur in "finally" blocks
bug 主要
finally块中使用return, break, throw等Jump statements,会阻止在try catch中抛出的未处理异常的传播
66、Locks should be released
bug 严重
保证锁的能够释放
67、Loop conditions should be true at least once
bug 主要
循环应该至少走一次
68、Loops should not be infinit
bug 阻断
循环不应该死循环
69、Math operands should be cast before assignment
bug 次要
数字操作在操作或赋值前要转化
70、Math should not be performed on floats
bug 次要
BigDecimal代替floats进行大数精确运算
71、Methods "wait(...)", "notify()" and "notifyAll()" should not be called on Thread instances
bug 阻断
不要在线程中使用"wait(...)", "notify()" and "notifyAll()"
72、Methods should not be named "hashcode" or "equal"
bug 主要
除非Override重写这些方法
73、Multiline blocks should be enclosed in curly braces
bug 主要
多列块应用大括号括起来
74、Neither "Math.abs" nor negation should be used on numbers that could be "MIN_VALUE"
bug 次要
不要对数值类型的MIN_VALUE值或返回值为此值进行Math.abs与取反操作,因为不会起作用。
75、Non-public methods should not be "@Transactional"
bug 主要
非public方法不要注解Transactional,调用时spring 会抛出异常
76、Non-serializable classes should not be written
bug 主要
执行写操作的类要序列化,否则会抛出异常
77、Non-serializable objects should not be stored in "HttpSession" objects
bug 主要
HttpSession要保存序列化的对象
78、Non-thread-safe fields should not be static
bug 主要
非线程安全的域不应该静态化
79、Null pointers should not be dereferenced
bug 主要
空指针引用不应被访问
80、Optional value should only be accessed after calling isPresent()
bug 主要
Optional实例值的获取要isPresent()之后再做操作
90、Printf-style format strings should not lead to unexpected behavior at runtime
bug 阻断
因为Printf风格格式化是在运行期解读,而不是在编译期检验,会存在风险
91、Raw byte values should not be used in bitwise operations in combination with shifts
bug 主要
原始字节值不应参与位运算
result = (result << 8) | readByte(); // Noncompliant
正:
result = (result << 8) | (readByte() & 0xff);
92、Reflection should not be used to check non-runtime annotations
bug 主要
反射操作不应该运于检查非运行时注解
93、Related "if/else if" statements should not have the same condition
bug 主要
if/else if中不应该有相同的条件
94、Resources should be closed
bug 阻断
打开的资源应该关闭并且放到finally块中进行关闭
95、Return values from functions without side effects should not be ignored
bug 主要
操作对函数返回值没有影响的应该忽略
public void handle(String command){
command.toLowerCase(); // Noncompliant; result of method thrown away
...
}
96、Servlets should not have mutable instance fields
bug 主要
servlet容器对每一个servlet创建一个实例导致实例变量共享产生问题
struts1.x 也是单例
97、Short-circuit logic should be used to prevent null pointer dereferences in conditionals
bug 主要
应正确使用短路逻辑来防止条件中的空指针引用访问
98、Silly equality checks should not be made
bug 主要
愚蠢的相等检查不应该做
非同类型的对象equal
99、Spring "@Controller" classes should not use "@Scope"
bug 主要
保持spring controller的单例
100、Synchronization should not be based on Strings or boxed primitives
bug 主要
字符串和封箱类不应该被用作锁定对象,因为它们被合并和重用。
101、The non-serializable super class of a "Serializable" class should have a no-argument constructor
bug 次要
序列化的类的非序列化父类应有一个无参构造器
102、The Object.finalize() method should not be called
bug 主要
Object.finalize()不要人为去调用
103、The Object.finalize() method should not be overriden
bug 主要
Object.finalize()不要重写
104、The signature of "finalize()" should match that of "Object.finalize()"
bug 主要
Object.finalize()不要重写
105、The value returned from a stream read should be checked
bug 次要
从流中读取的值应先检查再操作
106、Thread.run() should not be called directly
bug 主要
调用start()
107、Useless "if(true) {...}" and "if(false){...}" blocks should be removed
bug 主要
无用的if(true)和if(false)块应移除
108、Value-based classes should not be used for locking
bug 主要
基于值的类不要用于锁对象
109、Value-based objects should not be serialized
bug 次要
基于值的对象不应被用于序列化
110、Values should not be uselessly incremented
bug 主要
值增减后不存储是代码浪费甚至是bug
111、Variables should not be self-assigned
bug 主要
变量不应该自分配如下:
public void setName(String name) {
name = name;
}
112、Week Year ("YYYY") should not be used for date formatting
bug 主要
日期格式化错误
113、Zero should not be a possible denominator
bug 严重
零不应该是一个可能的分母
114、Loops should not be infinite
Bug 阻断
循环不应该是无限的