sonar代码扫描常见问题以及处理方案

本文详细探讨了sonar代码审查中遇到的八个关键问题,包括IO流管理、finally块规范、空指针预防、操作状态代码处理、冗余资源清理、方法复杂性控制、BigDecimal使用优化和条件调整。提供了解决方案和最佳实践,助力提升代码质量与可维护性。


)

一. 没有关闭io流

sonar

Use try-with-resources or close this "FileInputStream" in a "finally" clause.

错误示例


FileInputStream fis = null;
byte[] buffer = new byte[1024];
try {
    fis = new FileInputStream(new File("E:\Java文件.txt")); 
    while (fis.read(buffer) > 0) {
        System.out.println(new String(buffer)); 
    }
} catch(Exception e) {
    e.printStackTrace();
}

解决办法

在catch后加上关闭代码
finally{
                if(null != printwriter) {
                    printwriter.close();
                }
            }
使用try-with-resources ,放在try里面
try ( Fil eInputStream fis = new FileInputStream(new File("E:\Java文件.txt"))) {
	out2.println("the text");
} catch (IOException e) {
	e.printStackTrace();
}

注: 要是使用的是idea ,可以使用ctrl + alt + T ,找到try-with-resources 快捷解决

二. 在finally语句块中有return,continue,throw 语句

sonar

Remove this return statement from this finally block.
Remove this continue statement from this finally block.
Remove this throw statement from this finally block.

错误示例

 } finally {
            try {
                fis.close();
            } catch (IOException e) {
                log.error("关闭流出现异常:{}", e);
                throw new Exception(); 
            }
 }

解决办法

 } finally {
          fis.close();
 }

三. 可能存在空指针异常,需要增加空值检测。

sonar

A "NullPointerException" could be thrown; "name" is nullable here

错误示例

String name = user.getName();

解决办法

String name ;
if(user != null ){
name = user.getName();
}

四. 当包含操作状态代码时,不应该忽略文件删除操作的结果

sonar

Do something with the "boolean" value returned by "delete".

错误示例

file.dekete();

解决办法

 if (!file.delete()) {
    // file delete failed; take appropriate action
  }

五. 移除没有用到的包、变量、方法

sonar


//移除没有用到的包、变量、方法
Remove this useless assignment to local variable xxx

错误示例

在这里插入图片描述

解决办法

需要看看这个变量有什么作用,没有作用的可以删除掉

六. 方法的认知复杂性不应太高

sonar

//方法的认知复杂性不应太高

Cognitive Complexity of methods should not be too high

//认知复杂性是衡量一种方法的控制流程理解难度的指标。认知复杂性高的方法难以别的开发人员去维护。
Cognitive Complexity is a measure of how hard the control flow of a method is to understand. Methods with high Cognitive Complexity will be difficult to maintain.

错误示例

在这里插入图片描述

解决办法

Compliant Solution(统一解决方案):

对应这种if-else 过多方法,我们主要目的是要消除 if-else ,每多一个 else 那么就会多一个逻辑分叉,代码的易读性会急速降低,这里收集总结了一些地址,需要的同学可以去看一下:
l如何无痛降低 if else 面条代码复杂度 .

七. BigDecimal的取值方法

sonar


//BigDecimal的取值方法
Use "BigDecimal.valueOf" instead.

错误示例


double d = 1.1;

BigDecimal bd1 = new BigDecimal(d); // Noncompliant; see comment above

BigDecimal bd2 = new BigDecimal(1.1); // Noncompliant; same result

解决办法

double d = 1.1;

BigDecimal bd1 = BigDecimal.valueOf(d);

BigDecimal bd2 = BigDecimal.valueOf(1.1);

八. 更改此条件,以便它不总是评估为“false"

sonar


//更改此条件,以便它不总是评估为“false"
Change this condition so that it does not always evaluate to “false

错误示例

在这里插入图片描述

解决办法

可以把这行删除掉,obj不可能为null if (obj == null) return false; 这样这个bug也没有了。

<think>我们正在解决Sonar扫描提示的问题:关于使用静态访问'cn.hutool.core.collection.CollUtil.isNotEmpty'的问题。根据Sonar的规则,它可能是指我们在调用静态方法时没有使用静态导入(StaticImport)的方式,或者可能是直接调用了静态方法而没有通过类名调用(但这种情况通常不会报错)。实际上,Sonar可能是在提示我们应该使用静态导入来使代码更简洁。然而,在引用[1]中,我们看到使用CollUtil.isEmpty()时是通过类名直接调用的。同样,在引用[2]中,也是通过类名调用CollUtil.newArrayList()。所以,用户的问题可能是Sonar要求我们使用静态导入(StaticImport)的方式来调用CollUtil.isNotEmpty()。###解决方案####1.使用静态导入(推荐)静态导入可以使代码更简洁,避免重复书写类名。修改步骤如下:```java//在导入部分添加静态导入importstaticcn.hutool.core.collection.CollUtil.isNotEmpty;//然后直接在代码中使用if(isNotEmpty(list)){//处理非空集合}```####2.直接使用类名调用(如果Sonar允许)如果项目规范不允许静态导入,或者Sonar规则只是要求我们正确使用静态方法(即通过类名调用),那么我们可以保持原样。但根据问题描述,Sonar提示了问题,所以可能更倾向于静态导入。####3.检查Sonar规则的具体内容不同的Sonar规则可能提示不同的问题。常见的相关规则是:-`squid:S2208`:提醒使用静态导入来访问静态成员(如果多次使用)。-或者可能是关于工具类不应该被实例化的规则(如果错误地实例化了CollUtil)。如果问题是因为工具类被实例化,那么应该避免创建CollUtil的实例,直接使用静态方法。###修改示例假设原代码为:```javaimportcn.hutool.core.collection.CollUtil;publicclassExample{publicvoidprocess(List<String>list){if(CollUtil.isNotEmpty(list)){//...}}}```修改为静态导入后:```javaimportstaticcn.hutool.core.collection.CollUtil.isNotEmpty;publicclassExample{publicvoidprocess(List<String>list){if(isNotEmpty(list)){//...}}}```###注意事项1.**不要实例化工具类**:确保没有`newCollUtil()`这样的代码,因为工具类的方法都是静态的,实例化没有意义。2.**静态导入的使用场景**:如果在一个类中多次使用`CollUtil.isNotEmpty`,静态导入可以使代码更简洁。但如果只使用一两次,或者团队规范不推荐静态导入,则可以直接使用类名调用。3.**Sonar规则配置**:如果团队不希望使用静态导入,可以调整Sonar规则配置,忽略这条规则。###总结根据Sonar提示,我们推荐使用静态导入的方式来调用`CollUtil.isNotEmpty`,这样代码更简洁,符合Sonar代码质量要求。如果静态导入不符合项目规范,则可以直接通过类名调用,并调整Sonar规则配置。§§相关问题§§1.如何在Java中正确使用静态导入?2.Sonar静态方法访问规则的具体内容是什么?3.Hutool工具类中还有哪些常用的静态方法?</think>### 解决 Sonar 扫描提示的静态访问问题 根据 Sonar 的规范要求,当调用工具类的静态方法时,**必须使用类名直接调用**,而不是通过实例调用。以下是针对 `CollUtil.isNotEmpty()` 的解决方案: #### 错误用法(会触发 Sonar 警告) ```java // ❌ 错误:通过实例调用静态方法 CollUtil collUtil = new CollUtil(); if (collUtil.isNotEmpty(list)) { ... } ``` #### 正确用法(Sonar 规范推荐) ```java // ✅ 正确:直接通过类名调用静态方法 import cn.hutool.core.collection.CollUtil; if (CollUtil.isNotEmpty(list)) { // 处理非空集合 } ``` #### 修改步骤: 1. **删除工具类实例化** ```diff - CollUtil util = new CollUtil(); // 删除这行 - if (util.isNotEmpty(list)) {...} + if (CollUtil.isNotEmpty(list)) {...} ``` 2. **检查所有调用点** 全局搜索 `CollUtil` 实例化代码,确保所有静态方法都通过类名直接调用: ```java // 正确示例 boolean valid = CollUtil.isNotEmpty(userList); List<String> filtered = CollUtil.filter(list, obj -> ...); // 其他静态方法同样处理 ``` #### 原理说明: - **静态方法属于类**:`isNotEmpty()` 是类级别方法,不需要实例即可调用 - **Sonar 规则依据**:`squid:S2209` 规则禁止通过实例访问静态成员[^1] - **性能优势**:避免不必要的对象创建,减少内存开销 > **最佳实践**:结合静态导入进一步简化代码(可选): > ```java > import static cn.hutool.core.collection.CollUtil.isNotEmpty; > > if (isNotEmpty(list)) { // 更简洁的写法 > // 业务逻辑 > } > ``` #### 修改前后对比: | 指标 | 错误用法 | 正确用法 | |------|----------|----------| | Sonar 警告 | 触发规则 squid:S2209 | ✅ 通过检查 | | 内存占用 | 产生无用对象 | ⚡️ 零额外开销 | | 代码可读性 | 易误解为实例方法 | 明确静态方法语义 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值