Sonar扫描问题总结

一、移除未使用的包,变量,方法

Remove this useless assignment to local variable xxx

移除无用代码并非是一个技术问题,而是一种理念上的和文化上的问题。

二、增加有效注释,移除无用注释

This block of commented-out lines of code should be removed.

这种情况一般出现在对之前的代码进行注释修改后,准备下次修改的时候再拿来参考或者使用,这种是不推荐的大段的代码注释是非常影响阅读的。

我们在开发中需要增加有效注释,移除无用的无效注释。

三、if else 嵌套不要超过3层

Refactor this code to not nest more than 3 if/for/while/switch/try statements.

在写代码的时候,if/for/while/switch/try等代码的嵌套层数建议不要超过3层。当超过3层之后,代码的可读性和可维护性都会变的很差,同时如果做单元测试也会变的很艰难。

if else嵌套很多一般有三个原因

  • 空值判断

  • 业务判断

  • 状态判断

简单的if else语句可以采用三目运算符处理 String str; if (user.getAge()>18){ str="已成年"; }else { str="未成年"; }

str=user.getAge()>18?"成年":"未成年";

直接根据状态返回ture false可以直接返回

if(xxx=ture){

return ture;

}esle{

return false;

}

可以直接返回 return xxx=ture;

在我们的业务中,经常要对前端传的值判断是否为空产生多层if else嵌套

可以直接对VO添加@Validate注解判断是否为空

public class entity implements Serializable {
@NotNull(message = "参数不能为空")
private Integer id;

@NotBlank(message = "参数不能为空")
private String projectId;

@NotBlank(message = "参数不能为空")
private String token;

@NotEmpty(message = "参数不能为空")
private List etc;

//这里可以通过正则来校验时间格式是否正确
@NotNull(message = "参数不能为空")
@Pattern(regexp = "xxxx",message ="时间格式不符合规范" )
private Date date;
}

当空值判断,业务判断,状态判断都有时

(1)接口分层:把接口分为外部和内部接口,所有空值判断放在外部接口完成,只处理一次;而内部接口传入的变量由外部接口保证不为空,从而减少空值判断

public void doThings(Customer customer,String listen) {
if (null!=customer.getId()){
if (1 == customer.getId()){
if (customer.getAddress().equals("xxxx")){
//do something
}else {
//do something
}
}
if (2== customer.getId()){
//do something
}
if (3== customer.getId()){
//do something
}
}else {
if ( null== listen){
//do something
}
}
}

可以在外面新加一个方法进行空值判断,判断之后在进行业务判断

业务判断要是有很多,但是又不是太多的话可以将各种业务放到map里面

如果真的很多,而且后续可能还会有变动,值得再写一个策略模式进行实现

四、各种IO流使用完之后一定记得关闭

我们new一个 java流对象之后,就在内存中创建了一个对应类的实例对象,而且占用了一定的系统资源,比如文件句柄,端口,数据库连接等。在内存中的实例对象,当没有引用指向的时候,java垃圾收集器会按照相应的策略自动回收,但是却无法对系统资源进行释放。所以需要我们try-catch-finally手动释放资源

redis的redisTemplate不会主动释放连接,如果新的线程一直调用redis,就会出现redis连接池耗尽资源卡死

try-catch-finally

五、使用@Slf4j注解代替System.out.println

我们使用System.out.println得到的日志信息,关闭之后信息就丢失了,那我们想看到报错等等,就必须要重新运行程序。使用@Slf4j的log不但能持久化日志信息还能对信息进行分级,目前使用的多的有log.debug ();、log.info();、log.warn();、log.erro();

@Slf4j建议和log4j2一起使用

六、返回值是否应该为null

public List getList(List list){
if (!list.isEmpty()) {
return list;
}
//return null
return Collections.emptyList();
}

直接返回null可能会导致nullpointerException,返回一个空的集合处理会更好

七、常量 变量命名规则:

代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例: *name / __name / / Object$

类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外: DO / BO / DTO / VO / AO 正例: MarcoPolo / UserDO / XmlService / TcpUdpDeal / TaPromotion 反例: macroPolo / UserDo / XMLService / TCPUDPDeal / TAPromotion

方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从 驼峰形式。 正例: localValue / getHttpMessage() / inputUserId

常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。 正例: MAX_STOCK_COUNT 反例: MAX_COUNT

推荐使用阿里编码规约扫描

八、字符串比较的左边放常量,右边放变量

myString.equls("xxxx")

aaa==4

应该修改为

“xxxx”.equls(myString)

4==aaa

可以减少当设置aaa=4这种判断

九、

使用常量而不是直接填“xxxx”

SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
推荐在common/const文件中定义

10、定义并抛出一个专用的异常来代替一个通用的异常。

Define and throw a dedicated exception instead of using a generic one

不要全部都使用RuntimeException,尽量具体点,使用它的子类或者自定义异常

11、运算升级降级情况

double x=1+2

建议在使用1L+2L;浮点数是不精确的

需要精确的数建议使用demical

12、一个public 类全是static方法


public static String toJSONString(Object o){
return JSON.toJSONString(o, SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteMapNullValue);
}
}

一个public类里面都是static方法,应该创建一个private的构造方法//避免创建该类的实例。同时不需让其他类继承该类

13 空指针异常

NullPointerException” could be thrown; “document” is nullable here

[图片上传失败...(image-3f9ef9-1597823207341)]

增加空指針檢測

15、枚举命名不规范

举例:Success (0,"执行成功")应该为 SUCCESS (0,"执行成功")

枚举中编译后都是static的,不应该在枚举中生成set方法

16、推荐使用 而不是

?和T都表示不确定的类型 但如果是T的话 函数里面可以对T进行操作

17、序列化的对象包含的属性也要序列化

public class Address { //...}

public class Person implements Serializable {

private static final long serialVersionUID = 1905122041950251207L;

private String name;

private Address address;

// Noncompliant; Address isn't serializable

}

如果person已经序列化,其成员变量Address也进行序列化。不然转化时会有问题。

你可能感兴趣的:(Sonar扫描问题总结)