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<String> 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<Object> getList(List<Object> list){
if (!list.isEmpty()) {
return list;
}
//return null
return Collections.emptyList();
}

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

七、常量 变量命名规则:

代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。 反例: *name / __name / Object / 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的话 函数里面可以对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也进行序列化。不然转化时会有问题。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,546评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,224评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,911评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,737评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,753评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,598评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,338评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,249评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,696评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,888评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,013评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,731评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,348评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,929评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,048评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,203评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,960评论 2 355