文档章节

sonar常见错误以及处理方案

Fraud
 Fraud
发布于 2016/05/19 14:29
字数 1539
阅读 8900
收藏 4

总结我们在开发中常见的代码问题,同时将sonar中的问题也归纳了进来

 

一、异常处理中的未打印或者抛出异常信息

这个主要是没有将异常信息打印出来,又或者异常没有抛出。比如我们在action中,异常信息是打印成日志,而service中是将异常信息抛出,按照这样做了,就不会再有这类的错误。

l  Sonar

Either log or rethrow this exception.

 

l  错误示例

l  处理方案

将异常通过日志打印或者抛出

 

 

二、使用非同步的类来代替同步的类

非同步的类在执行效率上会高于同步的类,所以在不是必须同步的情况下,建议使用非同步类。

l  Sonar

Replace the synchronized class "StringBuffer" by an unsynchronized one such as "StringBuilder".

 

l  错误示例

l  处理方案

ArrayList or LinkedList instead of Vector

Deque instead of Stack

HashMap instead of Hashtable

StringBuilder instead of StringBuffer

 

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

l  Sonar

Remove this useless assignment to local variable xxx

 

l  错误示例

l  处理方案

移除无用的代码

 

四、增加有效注释,移除无用注释

我们在开发中,需要增加有效注释,移除无用的无效注释。有时候,在修改代码的时候也会将以前的代码进行注释,防止下次修改的时候再拿来参考或者使用。这个也不推荐,因为时间长了,这类的僵尸代码也比较难清除,并且影响代码的阅读

l  Sonar

This block of commented-out lines of code should be removed.

 

l  错误示例

l  处理方案

移除无用的注释

 

五、继承的方法需要添加@Override

l  Sonar

Add the "@Override" annotation above this method signature

 

l  错误示例

l  处理方案

在方法上方添加 @Override

 

六、嵌套不要超过三层

在写代码的时候,if/for/while/switch/try等代码的嵌套层数建议不要超过3层。当超过3层之后,代码的可读性和可维护性都会变的很差,同时如果做单测也会变的很艰难。

l  Sonar

Refactor this code to not nest more than 3 if/for/while/switch/try statements.

 

l  错误示例

if (condition1) {                  // Compliant - depth = 1

  /* ... */

  if (condition2) {                // Compliant - depth = 2

    /* ... */

    for(int i = 0; i < 10; i++) {  // Compliant - depth = 3, not exceeding the limit

      /* ... */

      if (condition4) {            // Noncompliant - depth = 4

        if (condition5) {          // Depth = 5, exceeding the limit, but issues are only reported on depth = 4

          /* ... */

        }

        return;

      }

    }

  }

}

 

l  处理方案

减少嵌套层数

 

七、方法块的圈复杂度过高

l  Sonar

The Cyclomatic Complexity of this method xxx is 11 which is greater than 10 authorized.

 

l  错误示例

l  处理方案

减少嵌套,减少代码行数,避免一个方法过于冗长和沉重,提高阅读性和可维护性。

 

八、应合并可折叠的if语句

l  Sonar

Merge this if statement with the enclosing one.

 

l  错误示例

if (file != null) {

  if (file.isFile() || file.isDirectory()) {

    /* ... */

  }

}

 

l  处理方案

if (file != null && isFileOrDirectory(file)) {

  /* ... */

}

 

private static boolean isFileOrDirectory(File file) {

  return file.isFile() || file.isDirectory();

}

 

九、集合的是否为空集合的判断

在java的一些api中,提供了类似字符串、集合等常见对象的取值和判断的方法,我们要加以运用。

l  Sonar

Use isEmpty() to check whether the collection is empty or not. 

 

l  错误示例

if (myCollection.size() == 0) {  // Noncompliant

  /* ... */

}

 

l  处理方案

if (myCollection.isEmpty()) {    // Compliant

  /* ... */

}

 

十、整形/长整形转字符串的方法

在java的一些api中,提供了类似字符串、集合等常见对象的取值和判断的方法,我们要加以运用。

l  Sonar

Use "Long.toString" instead.  

 

l  错误示例

int myInt = 4;

String myIntString = new Integer(myInt).toString(); // Noncompliant; creates & discards an Integer object

myIntString = Integer.valueOf(myInt).toString(); // Noncompliant

myIntString = 4 + "";  // Noncompliant

 

l  处理方案

int myInt = 4;

String myIntString = Integer.toString(myInt);

 

十一、       BigDecimal的取值方法

在java的一些api中,提供了类似字符串、集合等常见对象的取值和判断的方法,我们要加以运用。

l  Sonar

Use "BigDecimal.valueOf" instead.

 

l  错误示例

double d = 1.1;

 

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

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

 

l  处理方案

double d = 1.1;

 

BigDecimal bd1 = BigDecimal.valueOf(d);

BigDecimal bd2 = BigDecimal.valueOf(1.1);

 

 

十二、       使用新的变量来代替传入的变量

方法中传入的变量,一般情况下,我们认为是不可修改的,一旦可修改的话,在测试的时候不容易发现问题是调用方发生的错误还是方法本身发生的错误,这也是有的方法的传入参数为什么要定义为final类型的原因。

l  Sonar

Use isEmpty() to check whether the collection is empty or not. 

 

l  错误示例

class MyClass {

  public String name;

 

  public MyClass(String name) {

    name = name;                    // Noncompliant - useless identity assignment

  }

 

  public int add(int a, int b) {

    a = a + b;                      // Noncompliant

 

    /* additional logic */

 

    return a;                       // Seems like the parameter is returned as is, what is the point?

  }

 

  public static void main(String[] args) {

    MyClass foo = new MyClass();

    int a = 40;

    int b = 2;

    foo.add(a, b);                  // Variable "a" will still hold 40 after this call

  }

}

 

l  处理方案

class MyClass {

  public String name;

 

  public MyClass(String name) {

    this.name = name;               // Compliant

  }

 

  public int add(int a, int b) {

    return a + b;                   // Compliant

  }

 

  public static void main(String[] args) {

    MyClass foo = new MyClass();

    int a = 40;

    int b = 2;

    foo.add(a, b);

  }

}}

 

十三、       使用正确的类型转换方法

类型转换的方法有很多种方式,我们需要使用更合适的。

l  Sonar

Use "Integer.parseInt" for this string-to-int conversion

 

l  错误示例

String myNum = "12.2";

 

float f = new Float(myNum).floatValue();  // Noncompliant; creates & discards a Float

 

l  处理方案

String myNum = "12.2";

 

float f = Float.parseFloat(myNum);

 

十四、       不要使用System.out或者System.err

避免使用System.out和Sytem.err,而使用日志的方式输出,同时注意日志的级别,如果只是自己调试使用的话,不要使用Info以上的级别,使用debug就可以了。

l  Sonar

Replace this usage of System.out or System.err by a logger.

 

l  错误示例

System.out.println("My Message");  // Noncompliant

 

l  处理方案

logger.info("My Message");

 

十五、       字符串比较的左边放常量,右边放变量

l  Sonar

Move the "0" string literal on the left side of this string comparison.

 

l  错误示例

String myString = null;

 

System.out.println("Equal? " + myString.equals("foo"));                        // Noncompliant - will raise a NPE

System.out.println("Equal? " + (myString != null && myString.equals("foo")));  // Noncompliant - null check could be removed

 

l  处理方案

System.out.println("Equal?" + "foo".equals(myString));                         // Compliant - properly deals with the null case

 

© 著作权归作者所有

Fraud
粉丝 40
博文 36
码字总数 25050
作品 0
程序员
私信 提问
配置sonar、jenkins进行持续集成和代码审查

本文以CentOS操作系统为例介绍Sonar的安装配置,以及如何与Jenkins进行集成,通过pmd-cpd、checkstyle、findbugs等工具对代码进行持续审查。 一、安装配置sonar 1、Sonar介绍 Sonar是一个用于...

openthings
2015/12/09
1K
0
sonar安装配置

下载地址(jdk版本需要1.8以上,默认账号密码--admin:admin) SonarQube https://www.sonarqube.org/downloads/ sonar-runner http://repo1.maven.org/maven2/org/codehaus/sonar/runner/so......

aaron428
2017/08/31
0
0
Java静态检测工具/Java代码规范和质量检查简单介绍(转)

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

easonjim
2017/10/18
0
0
Objective C静态代码扫描和代码质量管理 OClint + SonarQube

OClint是针对C, C++及Objective C代码的静态扫描分析工具,而SonarQube是一个开源的代码质量管理平台。本文将实现将OClint的扫描结果导入到SonarQube中,已实现对Objective C代码质量的管理。...

Liuxz-aaa
2015/09/24
292
0
SonarQube代码质量分析平台介绍

1.使用需求 随着互联网产品迭代越来越快,客户对产品的要求也越来越高,因此如何高质量的交付代码,及时地对代码质量进行分析并给出合理的解决方案就成为了当下必须要解决的一个问题。Sonar...

江边望海
2015/07/15
801
0

没有更多内容

加载失败,请刷新页面

加载更多

如何使用Selenium WebDriver截屏

有谁知道是否可以使用Selenium WebDriver截屏? (注:不是硒RC) #1楼 吉顿 import org.openqa.selenium.OutputType as OutputTypeimport org.apache.commons.io.FileUtils as FileUtils......

技术盛宴
28分钟前
4
0
高阶函数

定义:能够包装函数的,使原本函数增加一些额外的福利的函数 比如: function higherOrderFn(fn){} 能够对fn增加一些额外的福利 应用场景: (function () { var getLogin = functio...

gtandsn
34分钟前
9
0
架构师成长之后

小致Daddy
35分钟前
6
0
Git 介绍和日常命令

git 介绍 GitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名GitHub。 GitHub于2008年4月10日正式上线,除了Git代码仓库托管及基本的 Web管理...

郭靖Michael
今天
9
0
技巧以管理R会话中的可用内存

人们使用什么技巧来管理交互式R会话的可用内存? 我使用下面的函数(基于Petr Pikal和David Hinds在2004年r-help列表中的发布)列出(和/或排序)最大的对象,并偶尔对其中一些对象进行rm() ...

javail
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部