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 - ... |
不要使用.*的方式将所有类导入进来,而应该详细的导入每一个用到的类 |