SONAR代码扫描部分问题总结

id squid:S2639

  • 描述: Regular expressions are powerful but tricky, and even those long used to using them can make mistakes.
  • 问题说明:str.replaceAll(".", “ ”);. 第一个参数是正则表达式,配任何单个字符。在replaceAll中使用,它匹配所有内容,所以所有内容都将会被替换
  • 解决方案:写入正确的正则表达式,如果要替换所有的字符串,就不需要调用,如果只匹配".",可以使用str.replaceAll("\.", “ ”);

id squid:S2119

  • 描述: “Random” objects should be reused

  • 问题说明:在意个类的多个方法中使用了Random random = new Random(); 应该重用“随机”对象 随机数种子在创建一个random对象的时候生成,相同 的随机数种子,产生相同随机数的几率非常高

  • 解决方案:随机数定义为一个属性,然后在下面的方法里面生成随机值

    private Random rand =  new SecureRandom();  // SecureRandom is preferred to Random
    
    public void doSomethingCommon() {
      int rValue = this.rand.nextInt();
      //...
    

id squid:S2095

  • 描述: Resources should be closed

  • 问题说明:连接(Connections)、流(Streams)、文件(files)等实现了Closeable接口的类,在使用以后应该关闭,并且所有的关闭都应该放到finally里面。

  • 解决方案:

    OutputStream stream = null;
    try {
    stream = new FileOutputStream(“myfile.txt”);
    for (String property : propertyList) {
    // …
    }
    } catch (Exception e) {
    // …
    } finally {
    stream.close();
    }
    }


    try (OutputStream stream = new FileOutputStream(“myfile.txt”){

    ​ for (String property : propertyList) {
    ​ // …
    ​ }
    } catch (Exception e) {
    ​ // …
    }
    }

id squid:S2293

  • 描述: The diamond operator ("<>") should be used

  • 问题说明:Java 7引入了运算符(<>),以减少泛型代码的冗长性。例如,不必在列表的声明和构造函数中声明列表的类型,现在可以使用<>来简化构造函数声明,编译器将推断该类型。

    请注意,当项目的sonar.java.source低于7时,此规则将自动禁用

  • 解决方案:省略定义变量后面的列表类型

Map> map = new HashMap<>();

id squid:S1186

  • 描述: Methods should not be empty

  • 问题说明:方法体为空,没有任何实现。方法没有方法体有以下几个原因:

    这是一个无意的疏忽导致,应该加以纠正,以防止在生产中出现意外行为。

    这个方法还没有或者永远不会实现。在这种情况下,应该抛出 UnsupportedOperationException 。

    该方法是一个有意为空的重写。在这种情况下,嵌套注释应该解释空白覆盖的原因。

  • 解决方案:添加注释说明或者抛出异常

    @Override
    public void doSomething() {
      // Do nothing because of X and Y.
    }
    
    @Override
    public void doSomethingElse() {
      throw new UnsupportedOperationException();
    }
    

id squid:S1604

  • 描述 Anonymous inner classes containing only one method should become lambdas

  • 问题说明:在Java8之前,在Java中部分支持闭包的唯一方法是使用匿名内部类。但是匿名类的语法看起来很难理解。

    在Java 8中,匿名内部类的大多数使用应该被lambdas替代,以高度提高源代码的可读性。

    请注意,当项目的sonar.java.source低于8时,此规则将自动禁用。

  • 解决方案:内部类使用lambdas表达式替换

    myCollection.stream().map(new Mapper() {
      public String map(String input) {
        return new StringBuilder(input).reverse().toString();
      }
    });
    
    Predicate isEmpty = new Predicate {
        boolean test(String myString) {
            return myString.isEmpty();
        }
    }
    

    –>

    myCollection.stream().map(input -> new StringBuilder(input).reverse().toString());
    
    Predicate isEmpty = myString -> myString.isEmpty();
    

id squid:S1118

  • 描述 Utility classes should not have public constructors

  • 问题说明:实用程序类是静态成员的集合,不应该被实例化。即使可以扩展的抽象实用程序类也不应该有公共构造函数。

    Java向每个没有显式定义至少一个类的类添加隐式公共构造函数。因此,至少应该定义一个非公共构造函数。

  • 解决方案:向工具类中添加一个非公共的构造函数

    class StringUtils { // Compliant
      private StringUtils() {
        throw new IllegalStateException("Utility class");
      }
      public static String concatenate(String s1, String s2) {
        return s1 + s2;
      }
    }
    

id squid:S1948

  • 描述 Fields in a “Serializable” class should either be transient or serializable

  • 问题说明:字符串判断是否为空的时候,通常是

    if (signPdfRequest.getSysFlag() == null 4|| “”.equals(signPdfRequest.getSysFlag())) {
    errors.append(“系统标识不能为空;”);
    }

    特别是如果有很多,会导致代码可读性变差

  • 解决方案:改为一下写法或者使用注解@Valid

    if (StringUtils.isEmpty(signPdfRequest.getSysFlag())) {
    errors.append(“系统标识不能为空;”);
    }

你可能感兴趣的:(sonar)