Sonar问题及解决方案汇总

Sonar

Avoid long parameter lists.

方法参数过多,最多允许5个

Missing a Javadoc comment.

需要注释

Expected @param tag for 'area'.

需要注释

Expected @return tag.

需要注释

Expected @throws tag for 'Exception'.

需要注释

Unused @param tag for 'licenseInfoMap'.

修改注释

Line is longer than 160 characters (found 162).

每一行代码不得超过160个字符,需要分行

Add a private constructor to hide the implicit public one.

常量类和工具类需要一个私有的构造器,同时将该类定义为final,不可继承

Variables that are final and static should be all capitals, 'logger' is not all capitals.

final修饰的变量名称需要全部大写

Only variables that are final should contain capitals (except for underscores in standard prefix/suffix), '_tar' is not final.

只有final修饰的变量名称中才可以有下划线,要么去掉下划线,要么加上final修饰符,Map,List和java对象加上final修饰符后,代表这个对象指向的内存地址不可变,但内容和值都是可以改变的

Name '_targetDataSources' must match pattern '(^[a-z][a-z0-9][a-zA-Z0-9]{0,50}$)'.

变量命名需要符合正则表达式

The field name indicates a constant but its modifiers do not

变量没有final修饰却使用了final变量的命名规则

Variables should start with a lowercase character, 'SUSPEND_MAP' starts with uppercase character.

普通变量(即没有final修饰)需要驼峰式命名,首字母为小写

More than 8 parameters (found 9).

构造方法只能有7个参数

Constructor has 9 parameters, which is greater than 7 authorized.

构造方法只能有7个参数

Define a constant instead of duplicating this literal "muluList" 6 times.

某个字符串出现了4次或以上,需要定义一个常量来代替

A method/constructor shouldnt explicitly throw java.lang.Exception

不能直接抛出Exception,需要精确到具体的异常,且最多抛出4个,超过请try catch

Define and throw a dedicated exception instead of using a generic one.

不能直接抛出Exception,需要精确到具体的异常,且最多抛出4个,超过请try catch

Remove this useless assignment to local variable "orgnIdL".

一个没有使用的变量,删掉即可

Avoid unused private fields such as 'fastGroup'.

一个没有使用的变量,删掉即可。如果不能删,则将private改为protected或default即可。

Exceptional return value of java.io.File.mkdirs() ignored in ...

mkdirs方法有返回值,如果是false则代表文件夹创建失败,需要处理。判断返回值是否正确,并进行处理,如记日志或抛异常等

Exceptional return value of java.io.File.delete() ignored in ...

delete方法有返回值,如果是false则代表文件删除失败,需要处理。判断返回值是否正确,并进行处理,如记日志或抛异常等

Use "java.nio.Files#delete" here for better messages on error conditions.

使用Files.delete(file.toPath())来代替file.delete()

Suspicious comparison of a Integer reference to constant in ...

Integer需要使用equals来比较,这是由于超出(-128~127)范围后,==无法比较,但equals性能较低

Refactor the code in order to not assign to this loop counter from within the loop body.

不要在循环体内操作计数器,重构代码

Rename "jdbcTemplate" which hides the field declared at line 116.

一个类中变量名称重复,重命名变量名称即可

Field ssoServer has the same name as a method

一个类中字段名称和方法名称重复,重命名即可

Merge this if statement with the enclosing one.

多个if可以合并,合并成一个

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

StringBuffer需要换成StringBuilder

A "NullPointerException" could be thrown; "dataResults" is nullable here.

在使用对象之前需要对这个对象进行非空判断

Possible null pointer dereference of track in ...

在使用对象之前需要对这个对象进行非空判断

Update this method so that its implementation is not identical to "getDvStatus" on line 149.

两个方法的内容完全一致,不用写两遍,在其中一个方法中调用另一个方法即可。或者删掉一个,全部使用另一个方法

Add a nested comment explaining why this method is empty, throw an UnsupportedOperationException or complete the implementation.

空的方法体内部需要写一个注释

Avoid throwing raw exception types.

自定义一个异常来继承RuntimeException,然后抛出这个自定义的异常,而不是抛出通用的RuntimeException

Define and throw a dedicated exception instead of using a generic one.

自定义一个异常来继承RuntimeException,然后抛出这个自定义的异常,而不是抛出通用的RuntimeException

New exception is thrown in catch block, original stack trace may be lost

在catch中抛出异常会使抛出的异常混淆,所以抛出的异常必须带着原异常信息。例如:throw new BusinessException(errorMsg, e)这里第二个参数是必须的

Avoid empty catch blocks

catch代码块不能为空

Either remove or fill this block of code.

删掉或填充这个代码块

Return an empty collection instead of null.

返回空集合Collections.emptyList()而不是null

Put single-quotes around '-' to use the faster "indexOf(char)" method.

将双引号改为单引号,理由是用char来找字符比用String来找效率更高

Method length is 221 lines (max allowed is 200).

一个方法最多200行,试着压缩,实在不行只能拆成多个方法

Avoid printStackTrace(); use a logger call instead.

catch中使用logger.error来代替e.printStackTrace()。Logger logger = LoggerFactory.getLogger(this.getClass())。记住,logger不可以在数据库对象类中使用

Remove this expression which always evaluates to "true"

这个判断语句总是为true,删掉即可

... concatenates strings using + in a loop

在循环中String不要用加号来拼接,而是使用StringBuilder

Avoid using implementation types like 'LinkedHashMap'; use the interface instead

在方法的参数中不要使用具体的实现类对象,而是使用它的接口对象。例如:不用LinkedHashMap而用Map

Iterate over the "entrySet" instead of the "keySet".

遍历Map不使用keySet而使用entrySet

... makes inefficient use of keySet iterator instead of entrySet iterator

遍历Map不使用keySet而使用entrySet

Move constants to a class or enum.

接口中不要定义常量,移到常量类中

Boxing/unboxing to parse a primitive ...

使用parse方法来代替valueOf方法

Null passed for non-null parameter of ...

将一个可能为空的参数传到了一个方法中,但在该方法中,该参数不可为空。修改这个方法,在使用变量前进行非空判断,则这个参数就成为了可为空参数

Remove this "Integer" constructor

不要使用new Integer来初始化变量的值,使用Integer.valueOf

new com.model.CatalogInfo() invokes inefficient new Integer(int) constructor; use Integer.valueOf(int) instead

不要使用new Integer来初始化变量的值,使用Integer.valueOf

HTTP parameter directly written to HTTP header output in ...

resp.setHeader("Content-Disposition", "attachment;filename = " + fileName)改为resp.setHeader("Content-Disposition", "attachment;filename = " + new String(fileName.getBytes("GBK"), "ISO8859-1"))

Relative path traversal in ...

new File(filePath + fileName)改为new File(filePath, fileName)。还有使用new FileInputStream(File srcFile)而不是使用new FileInputStream(filePath + fileName)

Boxing/unboxing to parse a primitive ...

.valueOf改为.parseXXX,这是由于valueOf返回的是包装类对象,而parseXXX返回的是值

Use try-with-resources or close this "FileInputStream" in a "finally" clause.

使用try(FileInputStream inFile = new FileInputStream(file)){System.out.println("...")}catch{}且不需要finally代码块来关闭,这是jdk1.7的新写法,可以将一些可自动关闭的资源写在try()中,就可以直接实现自动关闭

Change this "try" to a try-with-resources. (sonar.java.source not set. Assuming 7 or greater.)

使用try(FileInputStream inFile = new FileInputStream(file)){System.out.println("...")}catch{}且不需要finally代码块来关闭,这是jdk1.7的新写法,可以将一些可自动关闭的资源写在try()中,就可以直接实现自动关闭

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

System.out换成logger.info。记住,logger不可以在数据库对象类中使用。

System.out.println is used

System.out换成logger.info。记住,logger不可以在数据库对象类中使用。

Variable 'auditTypeName' must be private and have accessor methods.

只有静态变量才可以用public修饰,所以public改为private或protected或default

The return value of "valueOf" must be used.

这个语句的返回值必须要被使用,删掉或者使用它

Return value of String.valueOf(Object) ignored in ...

这个语句的返回值必须要被使用,删掉或者使用它

Synchronize this method to match the synchronization on "setSuspendMap".

一组get和set方法,如果其中一个方法被synchronized修饰,则另一个也需要使用synchronized 修饰

An empty statement (semicolon) not part of a loop

双分号导致sonar认为两个分号之间有一个空语句,删掉一个分号即可

Avoid empty if statements

if代码块不能为空,删掉或填充代码

A class which only has private constructors should be final

有private构造函数的类需定义为final类

Class Convert2Track should be declared as final.

该类需定义为final类

Verify this is the key that was intended; it was already set before.

该key之前已被塞入过一次,一个key塞两次没有意义,去掉一次

Extract this nested try block into a separate method.

不要在try代码块中再次使用try,去掉内部的,或者把内部的try代码块拉到外面去

Absolute path traversal in ...

直接将文件的绝对路径传到后台,然后生成File对象即会报错。如D:\1.jpg,不可直接传绝对路径,如果知道这个文件会在d盘,可定义常量D:\,然后传值为1.jpg,后台进行拼接后生成File对象即可

Only one statement per line allowed.

每一行只允许一个语句,可能是多写了分号,去掉即可

Make this anonymous inner class a lambda (sonar.java.source not set. Assuming 8 or greater.)

jdk1.8之后推荐使用兰布达表达式。请参考:https://blog.csdn.net/qq_33865313/article/details/81203412

Non-virtual method call in ... passes null for non-null parameter of ...

将一个可能为空的参数传到了一个方法中,但在该方法中,该参数不可为空。修改这个方法,在使用变量前进行非空判断,则这个参数就成为了可为空参数

A "NullPointerException" could be thrown; "printStream" is nullable here.

可能会抛出空指针异常,先进行非空判断

... could be null and is guaranteed to be dereferenced in ...

可能会抛出空指针异常,先进行非空判断

Unused import - ...

引入了一个类,但是没有使用,删掉即可

2' is a magic number.

这是一个魔术数字,需要定义一个常量,然后引用常量,而不是直接使用这个数字

+' is preceded with whitespace.

代码之前不能有空格,删掉空格即可

;' is not followed by whitespace.

代码之后没有空格,需要添加一个空格

?' is not preceded with whitespace.

代码之前没有空格,需要添加一个空格

Redundant 'private' modifier.

这个修饰符是多余的,删掉该修饰符即可

Incorrect lazy initialization of static field

对静态变量的延迟初始化有问题。一般可以试着把static修饰符去掉,或者在静态代码块中进行static变量的初始化。

... Service not allowed Autowired field ...

Service中不允许自动注解Manager,一般Service中都是注解其他Service,删掉这个Manager,换成相同功能的Service

Unread field: ... should this field be static?

final修饰的字段需要加上static修饰符

member def modifier' has incorrect indentation level 8, expected level should be 4.

缩进不对,可以删掉前面的缩进,用Tab键缩进,或者MyEclipse用Ctrl+Shift+F格式化代码

Change this code to use a stronger protocol.

修改编码以使用更强壮的协议,照着给的编码改就行

for child at indentation level 21 not at correct indentation, 20

首行缩进不对,使用Tab键进行缩进

0 is a valid index, but is ignored by this check.

0是一个有效的值,但在这里不能用。一般都是要用特殊的值,比如indexOf应该使用>=0或>-1

Use already-defined constant '...' instead of duplicating its value here.

使用已经定义的常量,而不是在这里复制它的值

Using the '.*' form of import should be avoided - ...

不要使用.*的方式将所有类导入进来,而应该详细的导入每一个用到的类

posted @ 2019-07-26 10:49  潘羊成  阅读(23433)  评论(2编辑  收藏  举报