字符串和封装类型应使用 equals()进行比较

例如java.lang.Integer使用引用等于==!=,因为它不是比较实际值,而是比较内存中的位置。

String firstName = getFirstName(); // String overrides equals
String lastName = getLastName(); if (firstName == lastName) { ... }; // 即使字符串具有相同的值,也为false

方法参数,捕获的异常和foreach变量的初始值不应忽略

public void doTheThing(String str, int i, List<String> strings) {
// str = Integer.toString(i); // 不符合规定 String str1 = str //在使用之前需要保存初始值 for (String s : strings) {
s = "hello world"; // Noncompliant
}
}

"InterruptedException" should not be ignored

在代码中不应该忽略中断异常,只在日志中打印异常日志,就像“忽略”一样。抛出中断异常会清除线程的中断状态,因此如果异常处理不当,那么线程被中断的信息将会丢失。相反,中断应该被重新抛出——立即或者在清理方法的状态之后——或者应该通过调用Thread.interrupt()来重新中断线程,即使这是单线程的应用程序。任何其他的操作过程都有延迟线程关闭的风险,并且丢失了线程被中断的信息——线程很可能没有完成它的任务。

类似地,也应该传播ThreadDeath异常。根据它的JavaDoc:

如果ThreadDeath异常被一个方法捕获,那么它被重新抛出是很重要的,这样线程就会结束。

不符合要求的代码如下:


public void run () {
try {
while (true) {
// do stuff
}
}catch (InterruptedException e) { // Noncompliant; logging is not enough
LOGGER.log(Level.WARN, "Interrupted!", e); // catch块中只是打印了异常日志,相当于忽略了这个异常。
}
}

解决方案

//Compliant Solution
public void run () {
try {
while (true) {
// do stuff
}
}catch (InterruptedException e) {
LOGGER.log(Level.WARN, "Interrupted!", e);
// 恢复中断状态
Thread.currentThread().interrupt();
}
}

枚举字段不应有public修饰的setter方法

enum通常被视为常量,但是enum带有public字段或public的setter方法的不仅是非常量的,而且还容易受到恶意代码的攻击。理想情况下,枚举字段应该用private修饰或者在构造器中赋值,但如果不可能,则应尽可能降低其可见性

反例

public enum Continent {

  NORTH_AMERICA (23, 24709000),
// ...
EUROPE (50, 39310000); public int countryCount; // 不合理
private int landMass; Continent(int countryCount, int landMass) {
// ...
} public void setLandMass(int landMass) { // 不合理
this.landMass = landMass;
}

规范写法

public enum Continent {

  NORTH_AMERICA (23, 24709000),
// ...
EUROPE (50, 39310000); private int countryCount;
private int landMass; public Continent(int countryCount, int landMass) {
// ...
} void setCountryCount(int countryCount){
this.countryCount = countryCount;
} public getCountryCount(){
return countryCount;
}

Sonar规范扫描Java代码暴露的问题的更多相关文章

  1. SonarQube 扫描 Java 代码

    SonarQube 扫描 Java 代码 环境 需要提前安装好 SonarQube7.9,安装步骤见 Docker 安装 SonarQube 步骤 填写项目名 my_project 填写token名 ...

  2. 开发规范总结-java代码

    java8新特性: 开发的时候适当用一些新特性的语法,可以使代码更简洁.譬如List根据某个属性转map.stream.函数式编程.lambda表达式 有一种场景:两个list一个转map 两个lis ...

  3. sonar扫描java、js、jsp技术

    最近在弄sonar扫描的事情,之前一直只能扫描java代码,这样统计出来的数据上报领导很多开发人员不服(说我不用写jsp了不用写js了?), 那么好,于是乎继续整sonar,在官网中看到sonar其实 ...

  4. Java代码规范

    Java代码规范 本Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改.本文档中没有说明的地方,请参看SUN Java标准代码规范.如果两边有冲突,以SU ...

  5. 静态代码扫描之阿里java代码规范IDEA插件

    前言 2017年2月9日,首次公布<阿里巴巴Java开发手册>; 2017年9月25日,阿里巴巴集团发布了<阿里巴巴Java开发手册>PDF终极版; 2017年10月14日,在 ...

  6. Java静态检测工具/Java代码规范和质量检查简单介绍(转)

    静态检查: 静态测试包括代码检查.静态结构分析.代码质量度量等.它可以由人工进行,充分发挥人的逻辑思维优势,也可以借助软件工具自动进行.代码检查代码检查包括代码走查.桌面检查.代码审查等,主要检查代码 ...

  7. java开发规范总结_代码编码规范

    规范需要平时编码过程中注意,是一个慢慢养成的好习惯 1.基本原则 强制性原则:     1.字符串的拼加操作,必须使用StringBuilder:     2.try…catch的用法 try{ }c ...

  8. (转)Java代码书写规范

    0. 安装阿里代码规范的eclipse插件 https://www.cnblogs.com/caer/p/7753522.html 1.基本原则 强制性原则:     1.字符串的拼加操作,必须使用S ...

  9. 阿里巴巴Java开发手册及Java代码规约扫描eclipse插件

    一.github地址: https://github.com/alibaba/p3c 二..eclipse插件的安装 此处示例采用eclipse,版本为 Neon.1 Release RC3 (4.6 ...

随机推荐

  1. python学习笔记(十四)python实现发邮件

    import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart u ...

  2. 如何实现Web视频聊天?

    在网页里实现文字聊天是比较容易的,但若要实现视频聊天,就比较麻烦了.这里,我们将实现一个简单的网页版视频聊天Demo,可以支持所有类型的浏览器. 本Demo除了视频聊天功能外,还包含以下功能: 1.上 ...

  3. 计算机网络-4-1-2-分类的IP地址

    有关IP最重要的文档就是互联网的正式标准RFC 791 IP地址及其表示方法 整个互联网就是一个单一,抽象的网络,IP地址就是给互联网上的每一台主机(或者路由器)的每一个接口分配一个在全世界范围内都是 ...

  4. 学习Tomcat(六)之类加载器

    通过前面的文章我们知道,Tomcat的请求最终都会交给用户配置的servlet实例来处理.Servlet类是配置在配置文件中的,这就需要类加载器对Servlet类进行加载.Tomcat容器自定义了类加 ...

  5. 5.java内存模型详细解析

    一. java结构体系 Description of Java Conceptual Diagram(java结构) 我们经常说到JVM调优,JVM和JDK到底什么关系,大家知道么?这是java基础. ...

  6. keepalived 安装和配置解析

    Keepalived的特性     配置文件简单:配置文件比较简单,可通过简单配置实现高可用功能     稳定性强:keepalived是一个类似于layer3, 4 & 7交换机制的软件,具 ...

  7. Windows下的程序及热键监视神器——Spy++

    Windows下的程序及热键监视神器--Spy++ 背景 在使用Windows的时候,偶尔会发现某些应用程序的热键不生效了:又或是桌面弹出了弹框却并不知道这个弹框来自何处.例如,本人最近使用Vim的时 ...

  8. C++核心编程 3 函数提高

    函数默认参数 在C++中,函数的形参列表中的形参是可以有默认值的: 语法:返回值类型 函数名 (参数 = 默认值){ } 实例: #include<iostream> using name ...

  9. .Net Core 获取上下文HttpContext

    1.先定义一个类 using Microsoft.AspNetCore.Http; namespace BCode.Util { public class MvcContext { public st ...

  10. Golang/Java 实现无重复字符的最长子串 - LeetCode 算法

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-subs ...