SonarQube代码检查,java代码优化(Bug类型)

文章目录

  • 一、bug类型
    • 1、运算类型优化
      • 将此乘法运算的一个操作数强制转换为“long”
      • 将此除法运算的一个操作数强制转换为“double”
      • 通过将“&0xff”添加到此表达式来阻止“int”提升
      • 更正运算符“||”两侧的一个相同子表达式
    • 2、变量类型优化
      • 删除“字节”的装箱
      • 移除"Double"的装箱
      • 引入一个新变量,而不是重复使用参数“row”
      • 请改用“BigDecimal.valueOf”
    • 3、try-catch-finally相关
      • 使用try with resources或关闭“finally”子句中的此“BufferedReader”。
        • 情形一:FileInputStream流没有关闭
      • 从这个finally块中删除这个throw语句。
      • 从finally块中删除此return语句
      • 重新中断此方法,或者重新引发可以在此处捕获的“InterruptedException”
    • 4、if模块相关
      • 更改此条件,使其不总是计算为“true”
      • 只应检查结果的标志
      • 删除此条件结构或编辑其代码块,使它们不完全相同
      • 无法到达该分支,因为该条件与同一“if/else-if”语句序列中的前一个条件重复
    • 5、返回值相关
      • 检查“read”调用的返回值,查看读取了多少字节
      • 对“delete”返回的“boolean”值执行操作
      • 必须使用返回值“length”
    • 未分类
      • 更新此作用域并删除“systemPath”
      • 保存并重复使用此“Random”
      • 重构这种可能导致大型输入堆栈溢出的重复
      • 向该方法添加类型测试
      • 该类重写“equals()”,因此也应重写“hashCode()”
      • “-1”对于设置“dayOfMonth”无效
      • 请确保此处应为周-年“YYYY”,而不是年“yyyy”
      • 使“sdf”成为实例变量
      • 删除此“return”语句或将其设为条件语句
      • 引发此异常或删除此无用语句
      • 重写Object.equals(Object-obj),或者完全重命名该方法以防止混淆
  • 二、漏洞类型
      • 更改此代码以使用更强的协议
      • 在此SSL/TLS连接上启用服务器证书验证
      • 使用安全填充方案
  • 参考文档

一、bug类型

1、运算类型优化

将此乘法运算的一个操作数强制转换为“long”

  • 解决思路把第一个运算数直接转换成很long类型即可,后面的所有运算会自动升级为long类型运算
cast one of the operands of this multiplication operation to a "long"
  • 原代码
long l=12*60*60
  • 更新后代码
long l=12L*60*60

将此除法运算的一个操作数强制转换为“double”

  • 解决思路把第一个运算数直接转换成double类型即可
cast one of the operands of this division operation to a "double"

通过将“&0xff”添加到此表达式来阻止“int”提升

  • java中 byte类型是用补码的:什么是原码、反码和补码
Prevent "int" promotion by adding "& 0xff" to this expression
  • 原代码
byte high = (byte) 0B11010000;
byte low = (byte) 0B01111111;
byte result = (byte) (high << 4 | low);
  • 更新后代码
//(high << 4 | low) 运算完之后会升级为int类型
//直接转换为beye类型,会直接舍弃高位,保留8位低位。效果和 0xff一样的
//这里是SonarQube会进行代码检查而已,本身逻辑没问题
byte high = (byte) 0B11010000;
byte low = (byte) 0B01111111;
byte result = (byte) ((high << 4 | low) & 0xff);

更正运算符“||”两侧的一个相同子表达式

correct one of the identical sub-expressions on both sides of operator "||"

2、变量类型优化

删除“字节”的装箱

remove the boxing of "byteint"
  • 原代码
int byteint= Integer.parseInt(swap,16) & 0xFF;
b[j] = new Integer(byteint).byteValue();
  • 更新后代码
int byteint= Integer.parseInt(swap,16) & 0xFF;
b[j] = byteint.byteValue();

移除"Double"的装箱

remove the boxing to "Double"
  • 原代码
public static void main(String[] args) {Double record = 2.58493128;Long longValue = Double.valueOf(record * Math.pow(10, 8)).longValue();System.out.println(longValue);
}
  • 更新后代码
public static void main(String[] args) {Double record = 2.58493128;Long longValue = (long)(record * Math.pow(10, 8));System.out.println(longValue);
}

引入一个新变量,而不是重复使用参数“row”

  • 报错原因:方法传入的参数尽量不要修改,而是创建一个新的变量接收
introduce a new variable instead of reusing the parameter "row"
  • 原代码
    public int queryAdd (int row,int b){row=mapper.queryCount();return row+b;}
  • 更新后代码
    public int queryAdd (int row,int b){a=mapper.queryCount();return a+b;}

请改用“BigDecimal.valueOf”

  • java中BigDecimal的介绍及使用,BigDecimal格式化,BigDecimal常见问题
Use "BigDecimal.valueOf" instead
  • 原代码
BigDecimal dataSize = new BigDecimal(new Double(0));
  • 修改后
BigDecimal dataSize = BigDecimal.valueOf(0);

3、try-catch-finally相关

使用try with resources或关闭“finally”子句中的此“BufferedReader”。

  • 解决方式:增加一个finally语句,关闭BufferedReader流即可
  • 文件流需要关闭
  • 数据库连接流:Connection、Statement 、ResultSet 也都要关闭
  • JDBC中关于Connection, PreparedStatement, ResultSet是否关闭的一些思考
Use try-with-resources or close this "BufferedReader" in a "finally" clause.
情形一:FileInputStream流没有关闭
  • 原代码
try{FileInputStream fileInput=new FileInputStream("C:\\Users\\ljj\\Desktop\\test.txt");
}catch (Exception e){e.printStackTrace();
}
  • 更新之后代码
//方式一
FileInputStream fileInput=null;
try{fileInput=new FileInputStream("C:\\Users\\ljj\\Desktop\\test.txt");
}catch (Exception e){e.printStackTrace();
}finally {if (fileInput!=null){fileInput.close();}
}
//方式二,简洁
try(FileInputStream fileInput=new FileInputStream("C:\\Users\\ljj\\Desktop\\test.txt")){}catch (Exception e){e.printStackTrace();
}

从这个finally块中删除这个throw语句。

remove this throw statement from this finally block.
  • 原代码
finally{try{reader.close;}catch (IOException e){throw e;}	
}
  • 更新后代码
finally{try{reader.close;}catch (IOException e){}	
}

从finally块中删除此return语句

  • 说明:因为finally里面写了return语句的时候,就会覆盖掉try代码块里面的return。因为finally是肯定会执行的。
remove this return statement from this finally block
  • 原代码
//单位某个人才写的代码,把return写进finally。作者发现catch模块虽然重新抛出了异常,但是因为finally会正常返回,catch抛出的异常失效
static String test() throws RuntimeException{try{int i=1/0;System.out.println(i);}catch (Exception e){throw new RuntimeException("运行时异常");}finally {return "finally返回";}
}
  • 更新后代码
static String test() throws RuntimeException{try{int i=1/0;System.out.println(i);}catch (Exception e){return "finally返回";}return "正常运行";
}

重新中断此方法,或者重新引发可以在此处捕获的“InterruptedException”

  • 提示原因:Thread.sleep()方法会开启一个新的线程,该线程报错之后未进行中断处理
  • Thread.currentThread().interrupt() 用法详解
  • Thread.currentThread().interrupt()
  • interrupt、interrupted 、isInterrupted 区别
either re-interrupt this method or rethrow the "InterruptedException"  that can be caught here
  • 原代码
try{Thread.sleep(3000);
}catch (InterruptedException e){e.printStackTrace();
}
  • 更新后代码
try{Thread.sleep(3000);
}catch (InterruptedException e){e.printStackTrace();Thread.currentThread().interrupt();
}

4、if模块相关

更改此条件,使其不总是计算为“true”

change this condition so that it does not always evaluate to "true"
  • 原代码
//构造函数不存在返回null,只有可能抛出错误
Account account=new AliyunAccount(dgInfo.getDbUsername(),dbInfo.getDbPass());
if(null==account){log.error("连接阿里云异常")throw new Exception("连接阿里云异常")
}
  • 修改后
Account account=new AliyunAccount(dgInfo.getDbUsername(),dbInfo.getDbPass());

只应检查结果的标志

Only the sign of the result should be examined
  • 原代码
if(a.compareTo(b)==-1){
}
  • 更新后代码
if(a.compareTo(b)<0){
}

删除此条件结构或编辑其代码块,使它们不完全相同

  • 提示原因:if里面执行的代码相同了
remove this conditional structure or edit its code blocks so that they're not all the same
  • 原代码
if(dept.equals("1")){System.out.println("这里是外联部");
} else if (dept.equals("2")) {System.out.println("这里是外联部");
}
  • 更新后代码
if(dept.equals("1")){System.out.println("这里是外联部");
}

无法到达该分支,因为该条件与同一“if/else-if”语句序列中的前一个条件重复

  • 提示原因:if的判定条件相同了
this branch can not be reached because the condition duplicates a previous condition in the same sequence of "if/else if" statements
  • 原代码
if(dept.equals("外联部")){System.out.println("这里是外联部");
} else if (dept.equals("外联部")) {System.out.println("这里是第二个外联部");
}
  • 更新后代码
System.out.println("这里是外联部");

5、返回值相关

检查“read”调用的返回值,查看读取了多少字节

  • 解决方式:【Java】文件流 BUG-Check the return value of the “read“ call to see how many bytes were read.
Check the return value of the "read" call to see how many bytes were read
  • 原代码
inputStream.read(data)
  • 更新后代码
while(-1 != inputStream.read(data)){
}

对“delete”返回的“boolean”值执行操作

do something with the "boolean" value returned by "delete"
  • 原代码
if(csvFile.exists()){csvFile.delete();
}
  • 更新后代码
//解决方案:增加false判断
if(csvFile.exists()){if (!csvFile.delete()) {log.error("文件删除失败");}
}

必须使用返回值“length”

The return value of "length" must be used
  • 原代码
String s = "abcdefg";
s.length();
  • 更新后代码
String s = "abcdefg";
int len = s.length();

未分类

更新此作用域并删除“systemPath”

update this scope and remove the "systemPath"
  • 原代码
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.15</version><scope>system<scope><systemPath>${project.basedir}/libs/hutool-all.jar</systemPath>
</dependency>
  • 更新后代码,作者还没想好

保存并重复使用此“Random”

  • 说明:这种提示是随机数应该需要重用,然后他给出的参考是这样的
  • java SecureRandom.getInstanceStrong()随机数的深坑
Save and re-use this "Random"
  • 原代码
Random rand=new Random();
  • 更新后代码
Random rand=new SecureRandom();

重构这种可能导致大型输入堆栈溢出的重复

Refactor this repetition that can lead to a stack overflow for large inputs
  • 原代码
//邮箱地址判断
//提示原因:([-+.]\\w+)* 在表达式里面重复了
Pattern pattern= Pattern.compile("^\\w+([-+.]\\w+)*@\\w+([-+.]\\w+)*\\.w+([-+.]\\w+)*$");
  • 更新后代码:作者还不知道

向该方法添加类型测试

  • 类型转换之前没有,进行判断
Add a type test to this method
  • 原代码
public boolean equals(Object obj) {Student student = (Student) obj;if (student.getName().equals(this.name)) return true;return false;
}
  • 修改后
public boolean equals(Object obj) {if (obj == null) {return false;}if (this.getClass() != obj.getClass()) {return false;}Student student = (Student) obj;if (student.getName().equals(this.name)) return true;return false;
}

该类重写“equals()”,因此也应重写“hashCode()”

  • 因为类中写了 equals 方法,但是却没有重写 hashCode 方法
  • 解决方法:补一个hashCode()方法即可,IDEA可以通过Alt+Insert自动生成。
this class overrides "equals()" and should therefore also override "hashCode()"

“-1”对于设置“dayOfMonth”无效

  • 注意:Java中月份是从0开始,即0表示1月;周日是数字1,以此类推;
"-1" it not a valid for setting "dayOfMonth"
  • 原代码
Calendar calendar = new GregorianCalendar(1900, 0, -1);
  • 修改后
Calendar calendar = new GregorianCalendar(1900, 0, 0);
calendar.add(Calendar.DATE, -1);

请确保此处应为周-年“YYYY”,而不是年“yyyy”

  • 报错原因:很少人会用周年,除非这里需要使用周年
  • YYYY表示的是当前周所在的年份:如果本周有某天跨年了那么就计入下一年
  • java中日期格式“YYYY”与“yyyy”的区别
  • 关于SimpleDateFormat处理时间格式容易忽视的问题
Make sure that week year "YYYY" is expected here instead of Year "yyyy"
  • 原代码
SimpleDateFormat formater = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
  • 修改后
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

使“sdf”成为实例变量

  • 有些类不是线程安全的,将变量生命为静态的可能会导致线程安全问题
Make "sdf" an instance variable
  • 原代码
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  • 修改后代码
public final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

删除此“return”语句或将其设为条件语句

Remove this "return" statement or make it conditional
  • 原代码
public static int maxArray(int a[]){for (int i : a) {return i;}return 0;
}
  • 更新后代码
public static int maxArray(int a[]){for (int i : a) {}return 0;
}

引发此异常或删除此无用语句

  • 错误原因:生成了异常对象,但是没有抛出。
Throw this exception or remove this useless statement
  • 原代码
try{System.out.println("程序正常执行!");
}catch (Exception e){System.out.println("程序非正常执行!");new RuntimeException("程序非正常执行!");
}
  • 更新后代码
try{System.out.println("程序正常执行!");
}catch (Exception e){System.out.println("程序非正常执行!");throw new RuntimeException("程序非正常执行!");
}

重写Object.equals(Object-obj),或者完全重命名该方法以防止混淆

either override Object.equals(Object obj),or totally rename the method to prevent any confusion

二、漏洞类型

更改此代码以使用更强的协议

Change this code to use a stronger protocol

在此SSL/TLS连接上启用服务器证书验证

Enablle server certificate validation on this SSL/TLS connextion
  • 原代码
@Override
public void checkClientTrusted(X509Certificate[] chain,String authType){
}

使用安全填充方案

Use a secure padding scheme
  • 原代码
SSLContext sc=SSLContext.getInstance("SSL")

参考文档

  • SonarQube扫描常见Bug、漏洞修复整理(持续更新中)
  • 代码质量管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/727924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android JNI 普通方法和静态方法详解

Android JNI 普通方法和静态方法详解 文章目录 Android JNI 普通方法和静态方法详解一、前言二、Android JNI 普通方法和静态方法1、native 的静态方法和普通方法&#xff08;1&#xff09; JNI定义nativie普通方法和静态方法&#xff08;2&#xff09;jni native-lib.cpp中的代…

【蓝桥杯基础算法】dfs(上)组合数,全排列

刚接触算法&#xff0c;有没有被递归又循环的dfs吓到&#xff1f;没关系&#xff0c;几个例题就可以彻底掌握&#xff01; 1.全排列 1-n的全排列,如输入3&#xff0c;按顺序对1-3进行排列 //枚举 #include<iostream> #include<algorithm> #include<cstring>…

[动态规划][蓝桥杯 2022 省 B] 李白打酒加强版 -- 代码注释含详解

P8786 [蓝桥杯 2022 省 B] 李白打酒加强版(洛谷) 洛谷题目链接 李白打酒很快活&#xff0c;而我打了一晚上代码才把这题弄懂&#x1f972; P8786 [蓝桥杯 2022 省 B] 李白打酒加强版(洛谷)题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示\***\*\*\*\*\***\*\*\**…

【Linux】软件控制USB重新上电、加载:usbreset、hubpower、uhubctl

1、usbreset 1.1 说明 usbreset 是操作 USB 设备重置,等同于如下代码: ioctl(fd, USBDEVFS_RESET, 0)最后调用 kernel的 usb_reset_device()函数 此函数会通知设备的 driver 前后重置。它在重置前解除绑定 driver ,然后再绑定回去。设 备的 configuration 也被重置后加载…

-bash: unzip: 未找到命令的解决方案

遇到 -bash: unzip: 未找到命令 这样的错误信息&#xff0c;表示你的系统中没有安装 unzip 工具。unzip 是一个常用的解压工具&#xff0c;用于解压缩 .zip 文件。你可以通过系统的包管理器安装它。 根据你使用的 Linux 发行版&#xff0c;安装 unzip 的命令会有所不同。下面是…

MUMU模拟器12连logcat的方法

大家好&#xff0c;我是阿赵。   在开发手机游戏的时候&#xff0c;在真机上会出现各种问题&#xff0c;在查询问题的时候&#xff0c;安卓手机需要用adb连接来连接手机看logcat输出分析问题。但由于连接手机比较麻烦&#xff0c;所以我都习惯在电脑用安卓模拟器来测试。   …

通过vue ui创建项目

确认前端环境都安装好之后 打开黑窗口 输入 vue ui 会打开一个vue的网页 在此创建项目 可以选择在那个路径创建 这是我的项目配置 这里是选择vue版本 我要用的是vue2 选好点击创建项目就好了 创建好后的重点的目录结构以及结构的作用 启动前端工程 将创建好的项目导入编译器 我…

跨境干货 | 想“躺平式”经营?TikTok Shop全托管模式入驻了解一下!

在当前跨境电商出海模式不断升级的背景下&#xff0c;全托管模式已经成为各类平台的标准配置。其中&#xff0c;TikTok全托管模式已经上线运行有很长一段时间了&#xff0c;这个模式下&#xff0c;主打一个“仅供货、免运营”&#xff0c;它降低了商家进入和运营TikTok市场的门…

基于51单片机的羽毛球计分器设计与实现

基于51单片机的羽毛球计分器设计与实现 摘要&#xff1a; 本文介绍了一种基于51单片机的羽毛球计分器设计方案。该计分器能够实时记录并显示双方选手的得分&#xff0c;同时提供了一些附加功能如计时、犯规计数等。本文首先简要介绍了羽毛球计分器的背景和需求&#xff0c;然后…

EMC电磁兼容学习之1

1&#xff09;常用器件如压敏电阻&#xff0c;气体放电管&#xff0c;等等的参数及使用 所有EMC问题&#xff0c;都是总结为公共阻抗耦合问题 federal [ˈfedərəl] 联邦的 常用器件&#xff1a;TVS GDT SPG MOV TSS PPTC GDT 经历三个放电过程&#xff1a;火花放电区 辉光放…

liunx操作系统 环境变量

环境变量 main函数参数 命令行参数环境变量 环境变量的查看环境变量的获取 main函数参数 命令行参数 main函数是有参数的&#xff0c;只是我们一般不适用 这是main函数从bash中读取进程数据使用的一个基本入口。 下面进行简单演示。 o 好oo都是我们输入的命令行参数。其实&a…

【Linux】开始使用gdb吧!

开始使用gdb吧&#xff01; 1 下载安装2 开始使用3 实践运用补充一下 print 的 功能 &#xff08;类似监视窗口的作用&#xff09;和显示堆栈的功能Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;&#xff01;&#xff01;下一篇文章见&#xff01;&am…

【程序人生】探索2024年AI辅助研发趋势

目录标题 探索2024年AI辅助研发趋势一、AI在编码中的应用智能代码生成助力开发错误检测与修复的即时反馈性能优化的智能建议 二、AI驱动的自动化工具三、AI与团队协作四、未来展望结语 探索2024年AI辅助研发趋势 随着人工智能技术的迅速发展&#xff0c;AI在各个领域的应用正日…

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。

漂亮的网页UI能够吸引人的眼球&#xff0c;给人留下深刻的印象。作为前端开发人员&#xff0c;可以通过不断学习和掌握设计技巧和工具&#xff0c;提升自己的UI设计能力&#xff0c;为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议&#xff1a; 学习设计基础知…

仿牛客网项目---消息队列的实现

本篇文章讲一讲我们的项目中用到的消息队列。 1.阻塞队列 2.kafka 我的项目为什么要用消息队列&#xff1f; 如果采用消息队列&#xff0c;那么评论、点赞、关注三类不同的事&#xff0c;可以定义三类不同的主题&#xff08;评论、点赞、关注&#xff09;&#xff0c;发生相应…

关于C/C++ riscv64、mipsel 平台标准库 std::atomic<T> 原子变量编译失败问题解决

RISCV64 适用 C/C STL 平台原子变量链接不上的问题&#xff0c;可以看下之前写的这篇文章。 RISC-V平台 std::atomic&#xff1c;T&#xff1e; 编译失败问题解决-CSDN博客 mipsel 平台上面也可以按照这个方式解决&#xff0c;在 mipsel 平台上面没法使用 8字节的STL原子变量&…

游戏盾如何应对微商城网站DDoS攻击

游戏盾如何应对微商城网站DDoS攻击&#xff1f;随着电子商务的快速发展&#xff0c;微商城网站已成为众多商家开展在线业务的重要平台。然而&#xff0c;与此同时&#xff0c;网络安全威胁也愈发严重。其中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击是一种常…

AI Agents之CrewAI智能体开发框架

一、前言 AI Agents 的开发是当前软件创新领域的热点。随着大语言模型 (LLM) 的不断进步&#xff0c;预计 AI 智能体与现有软件系统的融合将出现爆发式增长。借助 AI 智能体&#xff0c;我们可以通过一些简单的语音或手势命令&#xff0c;就能完成以往需要手动操作应用程序才能…

性能测试之性能调优

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 性能测试是通过模拟实际使用场景&#xff0c;对系统进行压力测试…

leetocode1047.删除字符串中的所有相邻重复项

思想&#xff1a;使用栈来存储最近访问过的元素。string尾部就是栈顶&#xff0c;可访问最近访问过的字符&#xff0c;后入先出。具体思想直接参考 【栈的好戏还要继续&#xff01;| LeetCode&#xff1a;1047. 删除字符串中的所有相邻重复项】 string方法API&#xff0c;记住…