滥用静态字段
由于在方法内对静态属性进行赋值操作
class A{
private static int count;
public void init(int num){
count = num;
}
}
引用null对象
引用了一个为 NULL 的对象
class A{
private static int count;
public void init(int num){
Integer num = null;
num.intValue();
}
}
本地变量存储了闲置不用的对象
对变量进行赋值,但是后面的代码没有用到这个变量
class A{
//第一种情况
public void init(int a){
int num = 3;
num = a;
}
//第二种情况
public void init(int a){
int num = 3;
//...
}
}
无用的代码
创建了无用的对象
class A{
public void init(int a){
List list = new ArrayList<>();
}
}
创建了无用的方法
class A{
public void init(){
List list = new ArrayList<>();
list.add("123");
list.add("234");
}
}
(滥用)异常捕获
在不会抛出异常的代码里尝试捕获异常
class A{
public void init(){
try{
List list = new ArrayList<>();
}catch (Exception e) {
}
}
}
方法的返回值使用不当
忽略没有副作用的方法的返回值
class A{
public void init(){
List list = new ArrayList<>();
list.size();
}
}
对 null 值的冗余校验
对已知的非空对象进行null值校验
class A{
public void init(){
if(getList() != null){
}else{
}
}
private List getList(){
List list = new ArrayList<>();
return list
}
}
对已知的空对象进行null值校验
class A{
public void init(){
if(getList() == null){
}else{
}
}
private List getList(){
return null
}
}
可疑的整数表达式
整数值上的空位掩码操作
class A{
public void init(int num){
int a = num & 0xFFFFFFFF;
}
}
重复分支
两个分支内的代码一样
class A{
public void init(int num){
if(num>0){
num = 0;
}else{
num = 0;
}
}
}
可疑的方法调用
代码包含绝对路径的硬编码引用
class A{
public void init(int num){
File file = new File("D:\test\test.txt");
}
}
比较两个浮点数是否相等
比较两个浮点数是否相等
class A{
public void init(double a,double b){
if (a == b){
}
}
}
引用空对象
引用已知为null的对象
class A{
public void init(List list){
if (list == null){
System.out.print(list.toString());
}
}
}
switch 语句使用不当
switch 语句缺少 default 分支
class A{
public void init(int a){
switch a {
case 1:
break;
case 2:
break;
}
}
}
引用空指针
可能会抛出空指针异常
class A{
public void init(List list){
System.out.print(list.size());
}
}
引用了某个异常控制的对象。
class A{
public void init(){
List list = null;
try{
list = new ArrayList<>();
}catch (Exception e) {
}
System.out.print(list.size());
}
}
方法调用对非null参数传递null值
class A{
public void init(String str){
//compareTo方法要求参数不能为null,否则会抛出NullPointerException
"abc".compareTo(str)
}
}
保证不能引用空值
class A{
public void init(boolean flag){
List list = null;
if(flag){
list.add("abc");
}
}
}
生成了无用/非信息的字符串
无效的 toString 方法
class A{
public void init(int[] arr){
//会打印出 arr 的哈希值,而不是数组的的内容
System.out.print(arr);
}
}
方法的返回值使用不当
该方法的返回值应该进行检查
class A{
public void init(int[] arr){
String dateString = getHeaderField(name);
dateString.trim();
}
}
PS:这种警告通常出现在调用一个不可变对象的方法,认为它更新了对象的值。
程序员似乎以为trim()方法将更新dateString引用的字符串。
但由于字符串是不可改变的,trim()函数返回一个新字符串值,在这里它是被忽略了。
该代码应更正:
String dateString = getHeaderField(name);
dateString = dateString.trim();
字符串格式化问题
传递的参数多于格式字符串中实际使用的参数
class A{
public void init(String num1,String num2){
//错误,这种写法不会格式化字符串
String dateString = String.format("num1: {},num2:{}", num1,num2)
String dateString2 = String.format("num1: {0},num2:{1}", num1,num2)
//正确的写法
String dateString3 = String.format("num1: %s,num2:%s", num1,num2)
}
}
比较不兼容的类型是否相等
调用equals()比较不同的类型
class A{
public void init(String str){
Integer num = new Integer()
if(str.equals(num)){
}
}
}
对象的比较使用了 “==” 而不是调用 equals 方法
可疑的比较
class A{
public void init(String str){
if("abc" == str){
}
}
}
与null值的冗余比较
没有对参数进行空值校验
class A{
public void init(String str){
System.out.println(getStr().size())
}
private List getList(){
return null;
}
}
IO流没有关闭
方法体内没有对IO流进行关闭
忽略了异常
方法忽略了异常
class A{
public void init(){
try{
}catch (Exception e) {
//当抛出异常时什么都没有做
}
}
}
方法返回值使用不当(多为忽略了方法返回值)
忽略了方法的异常返回值
class A{
public void init(){
File file = new File("/aaa")
//文件mkdir可能返回false
file.getParentFile().mkdirs()
}
}
序列化的类定义不正确
可序列化的类中存在不可序列化的属性
class A implements Serializable{
//List对象不能直接序列化
private List list;
}
Stirng 对象的比较使用了 == 或 !=
Stirng 对象的比较使用了 == 或 !=
String对象的比较应该使用 equals() 方法
不规范的方法名
方法名应该以小写字母开头,符合驼峰式命名格式
返回数组的方法可以暴露内部表示
可以通过返回的可变对象的引用来公开内部表示
class A{
private List list = new ArrayList<>();
public List getList(){
return list;
}
}
可以通过引用可变对象来公开内部表示
class A{
private List list;
public void setList(List list){
this.list = list;
}
}