# SonarLint 检查提示和解决方法

本文详细介绍了SonarLint工具的检查提示,包括正确使用内置格式、替换系统输出、条件方法调用、专用异常处理、格式化字符串等,提供了解决方案,帮助开发者提升代码规范和性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SonarLint 检查提示和解决方法

代码质量控制和代码质量相关工具说明: https://blog.csdn.net/qq_37248504/article/details/125383986


SonarLint: Use the built-in formatting to construct this argument.
  • 翻译:将连接字符串传递给日志记录方法也可能导致不必要的性能损失,因为每次调用该方法时都会执行连接,无论日志级别是否低到足以显示消息。应该使用内置的字符串格式而不是字符串连接,如果消息是方法调用的结果,则应该完全跳过前置条件,而应该有条件地抛出相关异常。

  • 反例

String message = "Hellow World!";
logger.info("Test Info message:"+message);
  • 正例
String message = "Hellow World!";
String format = String.format("Test Info message:%s", message);
logger.info(format);

SonarLint: Replace this use of System.out or System.err by a logger.
  • 翻译:使用专门的日志框架操作日志
  • 反例
System.out.printf("Hellow");
  • 正例
private static final Logger logger = Logger.getLogger(String.valueOf(Demo.class));
logger.info("Hellow");

SonarLint: Invoke method(s) only conditionally.
  • 翻译:构建代码,将静态或预先计算的值传递给前置条件、条件检查和记录调用。方法中参数直接是计算之后的结果,而不是计算并得到结果。
  • 反例
logger.info(String.valueOf((char)c));
  • 正例
String s2 = String.valueOf((char) c);
logger.info(s2);

SonarLint: Define and throw a dedicated exception instead of using a generic one.
  • 翻译:使用自己定义的异常类进行抛出异常错误等,不要使用原始的Exception等。
  • 反例
throw new Exception("Test");
  • 正例
public class MyException extends RuntimeException{

    public MyException() {
    }

    public MyException(String message) {
        super(message);
    }
}

throw new MyException("Hellow");

SonarLint: String contains no format specifiers.
  • 翻译:字符串不包含格式说明符。
  • 反例
String message = "Hellow Test!";
logger.info(String.format("method error: {}",message));
  • 正例
String message = "Hellow Test!";
logger.info(String.format("method error: %s",message));

SonarLint: Either re-interrupt this method or rethrow the “InterruptedException”.
  • 翻译:绝不应该在代码中忽略interruptedexception,在这种情况下,简单地将异常计数记录为“忽略”。InterruptedException的抛出将清除线程的中断状态,因此,如果异常没有得到正确的处理,那么线程被中断的事实就会丢失。相反,interruptedexception应该被重新抛出——立即或在清除方法的状态之后——或者应该通过调用thread .interrupt()重新中断线程,即使这是一个单线程的应用程序。任何其他操作都有延迟线程关闭的风险,并丢失线程被中断的信息——可能没有完成其任务。
  • 反例:
private  void dealAddNum() {
    try {
        num++;
        Thread.sleep(100);
    } catch (InterruptedException e) {
        log.info(e.getMessage());
    }
}
  • 正例:
private  void dealAddNum() {
    try {
        num++;
        Thread.sleep(100);
    } catch (InterruptedException e) {
        log.info(e.getMessage());
        Thread.currentThread().interrupt();
    }
}

SonarLint: Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.
  • 翻译:方法没有方法主体有以下几个原因:这是一个无意的疏忽,应该加以修正,以防止生产中出现意外的行为。它还没有得到支持,或者永远不会得到支持。在这种情况下,应该抛出UnsupportedOperationException。该方法是一个故意为空的覆盖。在这种情况下,一个嵌套的注释应该解释空白覆盖的原因。

  • 反例:

@Override
public void setProperties(Properties properties) {
    
}
  • 正例:
@Override
public void setProperties(Properties properties) {
    throw new UnsupportedOperationException();
}

SonarLint: “ThreadLocal” variables should be cleaned up when no longer used
  • 翻译:定义的线程局部变量在使用完之后,需要销毁。一旦持有线程不再活着,ThreadLocal变量就会被垃圾收集。在重用持有的线程时(在使用线程池的应用服务器上就是这种情况)可能会发生内存泄漏。
  • 反例:使用后没有销毁。
private static final ThreadLocal<SimpleDateFormat> DATETIME_FORMATTER = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

  • 正例:
private static final ThreadLocal<SimpleDateFormat> DATETIME_FORMATTER = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));

public void test1(){
    try{
        // do something
    }catch(Exception e){
        // do something
    }finally{
		DATETIME_FORMATTER.remove();
    }
}

SonarLint: Extract this nested try block into a separate method.
  • 翻译:嵌套的try/catch块严重影响了源代码的可读性,因为它使理解哪个块捕获哪个异常变得非常困难。
  • 反例:
@Test
public void test1(){
    try {

        try{

        }catch (NullPointerException e){
            logger.info(e.getMessage());
        }
    }catch (Exception e){
        logger.info(e.getMessage());
    }
}
  • 正例:
@Test
public void test1(){
    try {
        logger.info("test messages!");
    }catch (Exception e){
        logger.info(e.getMessage());
    }
}

SonarLint: Replace the usage of the “instanceof” operator by a catch block.
  • 翻译:应该使用适当类型的多个catch块,而不是捕获一般异常,然后对类型进行测试。
  • 反例:
try {
    // do somethings
} catch (Exception e) {
    if (e instanceof InvocationTargetException) {
        logger.error(LogConstant.LOG_FAILURE_PREFIX + (((InvocationTargetException) e).getTargetException()).getMessage());
    } else {
        logger.error(LogConstant.LOG_FAILURE_PREFIX + e.getMessage());
    }
    return result;
} 
  • 正例:
try{
    logger.info("test!");
}catch (NullPointerException nullPointerException){
    logger.info(nullPointerException.getMessage());
}catch (IllegalArgumentException illegalArgumentException){
    logger.info(illegalArgumentException.getMessage());
}

SonarLint: Use “java.util.Random.nextInt()” instead.
  • 翻译:没有必要将Random的nextDouble方法的输出乘以一个随机整数。使用nextt方法代替。当随机的任何返回浮点值的方法的返回值被转换为整数时,该规则会引发一个问题。
  • 反例:
user.setGender(((int)(10 * Math.random())) % 2  );
  • 正例:
Random random = new Random();
user.setGender(random.nextInt(10) % 2  );
IDEA插件,Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量 通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测 Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题 1. 不遵循代码标准 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写 2. 潜在的缺陷 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检测出潜在的缺陷 3. 糟糕的复杂度分布 文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员难以理解它们 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试 4. 重复 显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示源码中重复严重的地方 5. 注释不足或者过多 没有注释将使代码可读性变差,特别是当不可避免地出现人员变动时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷 6. 缺乏单元测试 sonar可以很方便地统计并展示单元测试覆盖率 7. 糟糕的设计 通过sonar可以找出循环,展示包与包、类与类之间相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。
### ENSP与Zabbix集成配置教程 #### 一、环境准备 在开始配置之前,需确保以下条件已满足: - 安装并运行ENSP模拟器。 - 配置好虚拟网络环境(如通过Cloud模块连接外部网络)。 - 已部署Zabbix Server及其依赖组件。 --- #### 二、ENSP侧配置 ##### 1. Cloud模块配置 在ENSP中添加Cloud模块用于实现物理网络与虚拟网络之间的通信。具体操作如下: - 添加Cloud模块至拓扑图。 - 在Cloud属性中配置UDP端口映射表,并勾选双向通道[^2]。 ##### 2. 路由器基础配置 以AR系列路由器为例,完成基本接口SNMP功能的初始化配置: ```bash [AR2]int g0/0/1 [AR2-GigabitEthernet0/0/1]ip address 192.168.133.130 255.255.255.0 [AR2-GigabitEthernet0/0/1]undo shutdown ``` 验证网络连通性: ```bash [AR2-GigabitEthernet0/0/1]ping 192.168.133.128 ``` ##### 3. SNMP协议启用 为了使Zabbix能够采集到设备状态数据,在路由器上启动SNMP服务并设置访问权限: ```bash [AR2]snmp-agent sys-info version v2c [AR2]snmp-agent community read net2001 ``` 进一步增强SNMP支持范围(可选): ```bash [AR2]snmp-agent sys-info version all [AR2]snmp-agent community write public [AR2]snmp-agent target-host trap-hostname zabbix address <ZABBIX_SERVER_IP> udp-port 161 trap-paramsname zabbix [AR2]snmp-agent trap enable ``` 测试SNMP连通性: ```bash [root@zabbix-server ~]# snmpwalk -c net2001 -v 2c 192.168.133.130 ``` 如果返回OID信息,则表示SNMP配置成功[^1]^,^[^3]. --- #### 三、Zabbix Server配置 ##### 1. 安装SNMP工具 确保Zabbix Server所在操作系统已安装`net-snmp`及相关工具包: ```bash [yum|apt-get] install -y net-snmp-utils ``` 重启相关服务以应用更改: ```bash systemctl restart zabbix-server zabbix-agent httpd rh-php72-php-fpm mariadb ``` ##### 2. 主机创建 登录Zabbix Web界面,依次执行以下步骤: - **导航路径**: Configuration → Hosts → Create host. - 填写主机名称及IP地址(对应ENSP中目标设备的实际IP)。 - 将其关联至默认SNMP模板或自定义模板。 ##### 3. 数据采集确认 等待一段时间后检查监控项是否正常更新。如有必要调整轮询频率以优化性能表现[^2]. --- #### 四、常见问题排查 1. 如果无法获取SNMP数据,请核查防火墙规则以及路由可达性; 2. 确认社区字符串一致性(read/write permissions),避免因权限不足引发错误; 3. 对于复杂场景下的高级需求,考虑引入第三方插件扩展功能集。 --- ### 总结 以上流程涵盖了从硬件层面直至软件平台的整体联动过程,旨在帮助技术人员快速搭建基于ENSP与Zabbix相结合的综合运维体系。实际操作过程中可能还会遇到其他特殊情况,建议参照官方文档深入学习各环节细节处理方法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值