1708 lines
83 KiB
Markdown
1708 lines
83 KiB
Markdown
# 代码审查报告
|
||
|
||
**文件:** `data\demo-pmd\src\com\demo\designep\DesignErrorProne.java`
|
||
**语言:** java
|
||
**耗时:** 195.1s
|
||
**分析工具:** pmd
|
||
|
||
---
|
||
|
||
总计: 771 | 错误: 166 | 警告: 598 | 建议: 7
|
||
|
||
静态分析 · 762 个问题
|
||
|
||
- 🔴 `pmd:AbstractClassWithoutAnyMethod` L30
|
||
抽象类没有抽象方法,abstract 可能只是用来阻止实例化
|
||
建议: 如果目的是阻止实例化,应使用私有或 protected 构造函数而非 abstract。
|
||
- 🔴 `pmd:SystemPrintln` L39
|
||
使用了 System.out/err 输出
|
||
建议: 改用 SLF4J/Log4j 等日志框架记录输出。
|
||
- 🔴 `pmd:AvoidThrowingNullPointerException` L75
|
||
避免手动抛出 NullPointerException
|
||
建议: 应通过参数校验、Objects.requireNonNull 等方式处理,而不是直接 new NullPointerException。
|
||
- 🔴 `pmd:AvoidThrowingRawExceptionTypes` L82
|
||
避免抛出原始异常类型 RuntimeException
|
||
建议: 抛出自定义异常或更具体的异常类型,并携带业务上下文。
|
||
- 🔴 `pmd:ClassWithOnlyPrivateConstructorsShouldBeFinal` L93
|
||
只有私有构造函数,应声明为 final
|
||
建议: 给类添加 final 修饰符,防止通过反射或内部类扩展。
|
||
- 🔴 `pmd:SystemPrintln` L103
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L140
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:FieldNamingConventions` L149
|
||
字段命名不符合约定
|
||
建议: 按 Java 命名规范:常量用 UPPER_SNAKE,普通字段用 lowerCamel。
|
||
- 🔴 `pmd:SystemPrintln` L155
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L158
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L161
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L164
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L167
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L170
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L173
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L176
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L179
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L182
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L185
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L188
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L191
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L194
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L197
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L200
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L203
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L206
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L209
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L212
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L215
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L218
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L221
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L224
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L227
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L230
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L233
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L236
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L239
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L242
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L245
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L248
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L251
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L254
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L257
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L260
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L263
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L266
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L269
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L272
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L275
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L278
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L281
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L284
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L287
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L290
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L293
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L296
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L299
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L302
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L422
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L423
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L424
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L425
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L426
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L427
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L428
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L429
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L430
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L431
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L432
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L433
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L436
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L437
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L438
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L439
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L440
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L441
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L442
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L443
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L444
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L445
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L446
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L447
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L450
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L451
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L452
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L453
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L454
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L455
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L456
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L457
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L458
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L459
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L460
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L461
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L464
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L495
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L496
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L497
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L498
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L501
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L502
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L503
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L504
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L507
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L508
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L509
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L510
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L513
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L514
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L515
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L516
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L528
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:AvoidReassigningParameters` L538
|
||
避免重新为参数赋值
|
||
建议: 使用新的局部变量保存修改后的值。
|
||
- 🔴 `pmd:SystemPrintln` L539
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L577
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L578
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L586
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L597
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:ConstructorCallsOverridableMethod` L693
|
||
构造函数中调用了可重写方法
|
||
建议: 避免在构造期间调用非 final/method,或将该方法设为 final/private。
|
||
- 🔴 `pmd:DoNotCallGarbageCollectionExplicitly` L702
|
||
不要显式触发垃圾回收
|
||
建议: 删除 System.gc(),交由 JVM 自动管理内存。
|
||
- 🔴 `pmd:AvoidThrowingRawExceptionTypes` L728
|
||
Avoid throwing raw exception type RuntimeException.
|
||
- 🔴 `pmd:EqualsNull` L758
|
||
避免使用 equals() 与 null 比较
|
||
建议: 使用 o == null 判空,而不是 o.equals(null)。
|
||
- 🔴 `pmd:AvoidReassigningParameters` L766
|
||
Avoid reassigning parameters such as 's'
|
||
- 🔴 `pmd:SystemPrintln` L768
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L788
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L790
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:MethodNamingConventions` L816
|
||
方法命名不符合约定
|
||
建议: 使用 lowerCamelCase 命名方法,如 sameName()。
|
||
- 🔴 `pmd:ClassWithOnlyPrivateConstructorsShouldBeFinal` L829
|
||
This class has only private constructors and may be final
|
||
- 🔴 `pmd:MoreThanOneLogger` L835
|
||
类中包含多个 logger
|
||
建议: 统一使用一个 logger 实例,避免日志输出混乱。
|
||
- 🔴 `pmd:SystemPrintln` L843
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:ReturnEmptyCollectionRatherThanNull` L882
|
||
应返回空集合而不是 null
|
||
建议: 返回 Collections.emptyList() 或 List.of()。
|
||
- 🔴 `pmd:SuspiciousEqualsMethodName` L909
|
||
方法名与 equals(Object) 高度相似,容易误导
|
||
建议: 重命名方法,或改为真正重写 equals(Object)。
|
||
- 🔴 `pmd:SystemPrintln` L928
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:FieldNamingConventions` L996
|
||
The field name 'TypeName' doesn't match '[a-z][a-zA-Z0-9]*'
|
||
- 🔴 `pmd:SingleMethodSingleton` L1029
|
||
类包含多个 getInstance 方法,单例模式混乱
|
||
建议: 只保留一个无参 getInstance(),移除重载方法。
|
||
- 🔴 `pmd:ClassWithOnlyPrivateConstructorsShouldBeFinal` L1029
|
||
This class has only private constructors and may be final
|
||
- 🔴 `pmd:SingletonClassReturningNewInstance` L1039
|
||
getInstance 总是创建新对象,不符合单例行为
|
||
建议: getInstance 应返回缓存的唯一实例,而不是新建对象。
|
||
- 🔴 `pmd:SystemPrintln` L1070
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L1078
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L1089
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:FieldNamingConventions` L1096
|
||
The constant name '_LOG' doesn't match '[A-Z][A-Z_0-9]*'
|
||
- 🔴 `pmd:GuardLogStatement` L1101
|
||
日志调用应使用日志级别守卫包裹
|
||
建议: 添加 if (LOGGER.isDebugEnabled()) 等守卫,或使用占位符避免字符串拼接。
|
||
- 🔴 `pmd:SystemPrintln` L1134
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L1178
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L1208
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:SystemPrintln` L1218
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:AvoidBranchingStatementAsLastInLoop` L1222
|
||
避免在循环末尾使用 break/continue 作为最后一条语句
|
||
建议: 调整循环结构,使正常退出条件更明确。
|
||
- 🔴 `pmd:AvoidMultipleUnaryOperators` L1230
|
||
多个一元运算符叠用可能造成误解或 bug
|
||
建议: 简化表达式,只保留一个运算符或使用括号明确语义。
|
||
- 🔴 `pmd:AvoidMultipleUnaryOperators` L1231
|
||
Using multiple unary operators may be a bug, and/or is confusing.
|
||
- 🔴 `pmd:SystemPrintln` L1232
|
||
Usage of System.out/err
|
||
- 🔴 `pmd:BrokenNullCheck` L1239
|
||
null 检查逻辑有误,可能导致 NullPointerException 或逻辑错误
|
||
建议: 检查短路语义:判空应使用 && 或 || 正确组合,并在空值分支避免解引用。
|
||
- 🔴 `pmd:BrokenNullCheck` L1242
|
||
Dereferencing the qualifier of this expression will throw a NullPointerException
|
||
- 🔴 `pmd:ProperCloneImplementation` L1254
|
||
clone() 应通过 super.clone() 实现
|
||
建议: 使用 super.clone() 并强制转换返回类型,而不是 new 新对象。
|
||
- 🔴 `pmd:ProperCloneImplementation` L1286
|
||
Object clone() should be implemented with super.clone()
|
||
- 🔴 `pmd:FieldNamingConventions` L1339
|
||
The field name 'LOG' doesn't match '[a-z][a-zA-Z0-9]*'
|
||
- 🔴 `pmd:FieldNamingConventions` L1344
|
||
The constant name '_LOG' doesn't match '[A-Z][A-Z_0-9]*'
|
||
- 🔴 `pmd:ClassWithOnlyPrivateConstructorsShouldBeFinal` L1372
|
||
This class has only private constructors and may be final
|
||
- 🔴 `pmd:FieldNamingConventions` L1373
|
||
The static field name 'INSTANCE' doesn't match '[a-z][a-zA-Z0-9]*'
|
||
- 🔴 `pmd:ClassWithOnlyPrivateConstructorsShouldBeFinal` L1384
|
||
This class has only private constructors and may be final
|
||
- 🔴 `pmd:FieldNamingConventions` L1385
|
||
The static field name 'INSTANCE' doesn't match '[a-z][a-zA-Z0-9]*'
|
||
- 🔴 `pmd:SystemPrintln` L1400
|
||
Usage of System.out/err
|
||
- 🟡 `pmd:AtLeastOneConstructor` L30
|
||
每个类应至少声明一个构造函数(适用于所有命中项)
|
||
建议: 为没有构造函数的类添加显式构造函数;若类不应被实例化,则改为私有构造。
|
||
- 🟡 `pmd:AbstractClassWithoutAbstractMethod` L30
|
||
该抽象类没有任何抽象方法
|
||
建议: 删除 abstract 关键字,或为类增加抽象方法。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L34
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L35
|
||
缺少默认访问修饰符的注释(方法/字段/类)
|
||
建议: 为包级私有成员添加 /* default */ 注释,或显式声明 private/protected/public。
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L35
|
||
参数未被赋值,可以声明为 final(适用于所有命中项)
|
||
建议: 在方法参数前添加 final 修饰符,避免无意中重新赋值。
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L35
|
||
Parameter 'b' is not assigned and could be declared final
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L35
|
||
Parameter 'c' is not assigned and could be declared final
|
||
- 🟡 `pmd:CollapsibleIfStatements` L37
|
||
该 if 语句可以与父级 if 合并
|
||
建议: 使用 && 或 || 将嵌套条件合并,减少嵌套层级。
|
||
- 🟡 `pmd:AvoidDeeplyNestedIfStmts` L38
|
||
if 嵌套过深,难以阅读
|
||
建议: 使用卫语句、提前返回或提取方法降低嵌套深度。
|
||
- 🟡 `pmd:CollapsibleIfStatements` L38
|
||
This if statement could be combined with its parent
|
||
- 🟡 `pmd:AtLeastOneConstructor` L47
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L48
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AvoidRethrowingException` L51
|
||
捕获异常后仅重新抛出,应避免
|
||
建议: 不要捕获该异常,直接在方法签名中声明抛出;若必须捕获,请加入实际处理逻辑。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L55
|
||
Missing commented default access modifier on method 'doWork()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L60
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L61
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L68
|
||
Missing commented default access modifier on method 'doWork()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L73
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L74
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L80
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L81
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L87
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L88
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AvoidUncheckedExceptionsInSignatures` L88
|
||
方法/构造函数不应显式声明非受检异常 RuntimeException
|
||
建议: 从 throws 子句中删除非受检异常。
|
||
- 🟡 `pmd:MissingStaticMethodInNonInstantiatableClass` L93
|
||
类无法实例化,且没有提供任何静态方法或字段
|
||
建议: 添加 public static 方法/工厂方法,或将类声明为 final 并仅作工具类使用。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L99
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L100
|
||
Missing commented default access modifier on method 'bad(int, int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L100
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L100
|
||
Parameter 'b' is not assigned and could be declared final
|
||
- 🟡 `pmd:CollapsibleIfStatements` L102
|
||
This if statement could be combined with its parent
|
||
- 🟡 `pmd:AtLeastOneConstructor` L110
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:DataClass` L110
|
||
类疑似数据类(只包含 getter/setter)
|
||
建议: 将数据与行为封装在一起,增加业务方法,避免仅作为数据容器。
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L113
|
||
非公共类型中声明了公共成员
|
||
建议: 将类改为 public,或将该成员的访问级别降为 package 私有。
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L116
|
||
Public member 'setName' declared in a non-public type
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L116
|
||
Parameter 'name' is not assigned and could be declared final
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L119
|
||
Public member 'getAge' declared in a non-public type
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L122
|
||
Public member 'setAge' declared in a non-public type
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L122
|
||
Parameter 'age' is not assigned and could be declared final
|
||
- 🟡 `pmd:MissingSerialVersionUID` L128
|
||
实现 Serializable 的类应定义 serialVersionUID
|
||
建议: 添加 private static final long serialVersionUID = 1L;
|
||
- 🟡 `pmd:AtLeastOneConstructor` L128
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:DoNotExtendJavaLangError` L128
|
||
异常不应继承 java.lang.Error
|
||
建议: 应继承 Exception/RuntimeException,Error 留给 JVM 内部严重错误。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L132
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L133
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:UnusedAssignment` L134
|
||
变量的初始值从未被使用
|
||
建议: 删除初始赋值,或直接使用最终需要的值初始化。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L142
|
||
Missing commented default access modifier on method 'check()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L148
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L149
|
||
Missing commented default access modifier on field 'CONST'
|
||
- 🟡 `pmd:FinalFieldCouldBeStatic` L149
|
||
final 字段可以声明为 static
|
||
建议: 若字段是编译时常量,请声明为 static final。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L153
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L154
|
||
Missing commented default access modifier on method 'm1(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L154
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L157
|
||
Missing commented default access modifier on method 'm2(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L157
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L160
|
||
Missing commented default access modifier on method 'm3(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L160
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L163
|
||
Missing commented default access modifier on method 'm4(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L163
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L166
|
||
Missing commented default access modifier on method 'm5(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L166
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L169
|
||
Missing commented default access modifier on method 'm6(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L169
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L172
|
||
Missing commented default access modifier on method 'm7(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L172
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L175
|
||
Missing commented default access modifier on method 'm8(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L175
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L178
|
||
Missing commented default access modifier on method 'm9(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L178
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L181
|
||
Missing commented default access modifier on method 'm10(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L181
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L184
|
||
Missing commented default access modifier on method 'm11(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L184
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L187
|
||
Missing commented default access modifier on method 'm12(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L187
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L190
|
||
Missing commented default access modifier on method 'm13(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L190
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L193
|
||
Missing commented default access modifier on method 'm14(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L193
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L196
|
||
Missing commented default access modifier on method 'm15(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L196
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L199
|
||
Missing commented default access modifier on method 'm16(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L199
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L202
|
||
Missing commented default access modifier on method 'm17(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L202
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L205
|
||
Missing commented default access modifier on method 'm18(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L205
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L208
|
||
Missing commented default access modifier on method 'm19(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L208
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L211
|
||
Missing commented default access modifier on method 'm20(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L211
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L214
|
||
Missing commented default access modifier on method 'm21(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L214
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L217
|
||
Missing commented default access modifier on method 'm22(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L217
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L220
|
||
Missing commented default access modifier on method 'm23(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L220
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L223
|
||
Missing commented default access modifier on method 'm24(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L223
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L226
|
||
Missing commented default access modifier on method 'm25(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L226
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L229
|
||
Missing commented default access modifier on method 'm26(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L229
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L232
|
||
Missing commented default access modifier on method 'm27(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L232
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L235
|
||
Missing commented default access modifier on method 'm28(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L235
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L238
|
||
Missing commented default access modifier on method 'm29(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L238
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L241
|
||
Missing commented default access modifier on method 'm30(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L241
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L244
|
||
Missing commented default access modifier on method 'm31(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L244
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L247
|
||
Missing commented default access modifier on method 'm32(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L247
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L250
|
||
Missing commented default access modifier on method 'm33(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L250
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L253
|
||
Missing commented default access modifier on method 'm34(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L253
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L256
|
||
Missing commented default access modifier on method 'm35(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L256
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L259
|
||
Missing commented default access modifier on method 'm36(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L259
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L262
|
||
Missing commented default access modifier on method 'm37(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L262
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L265
|
||
Missing commented default access modifier on method 'm38(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L265
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L268
|
||
Missing commented default access modifier on method 'm39(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L268
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L271
|
||
Missing commented default access modifier on method 'm40(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L271
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L274
|
||
Missing commented default access modifier on method 'm41(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L274
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L277
|
||
Missing commented default access modifier on method 'm42(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L277
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L280
|
||
Missing commented default access modifier on method 'm43(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L280
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L283
|
||
Missing commented default access modifier on method 'm44(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L283
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L286
|
||
Missing commented default access modifier on method 'm45(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L286
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L289
|
||
Missing commented default access modifier on method 'm46(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L289
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L292
|
||
Missing commented default access modifier on method 'm47(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L292
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L295
|
||
Missing commented default access modifier on method 'm48(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L295
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L298
|
||
Missing commented default access modifier on method 'm49(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L298
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L301
|
||
Missing commented default access modifier on method 'm50(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L301
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:UnusedPrivateField` L308
|
||
存在未使用的私有字段
|
||
建议: 删除该字段,或确认其确实被需要后补充使用。
|
||
- 🟡 `pmd:ImmutableField` L308
|
||
字段可以声明为 final
|
||
建议: 初始化后不再变更的字段应添加 final 修饰符。
|
||
- 🟡 `pmd:UnnecessaryConstructor` L310
|
||
构造函数不必要,编译器会生成默认构造
|
||
建议: 删除空的、无实际逻辑的构造函数。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L310
|
||
Missing commented default access modifier on constructor 'Immut()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L315
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L317
|
||
Public member 'getname' declared in a non-public type
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L320
|
||
Public member 'setname' declared in a non-public type
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L320
|
||
Parameter 'n' is not assigned and could be declared final
|
||
- 🟡 `pmd:AtLeastOneConstructor` L326
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L327
|
||
Missing commented default access modifier on method 'bad(A)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L327
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:LawOfDemeter` L328
|
||
Call to `getB` on foreign value `a` (degree 1)
|
||
- 🟡 `pmd:AtLeastOneConstructor` L330
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L330
|
||
Missing commented default access modifier on nested class 'A'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L331
|
||
Missing commented default access modifier on method 'getB()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L335
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L335
|
||
Missing commented default access modifier on nested class 'B'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L336
|
||
Missing commented default access modifier on method 'getC()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L340
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L340
|
||
Missing commented default access modifier on nested class 'C'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L341
|
||
Missing commented default access modifier on method 'doIt()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L347
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L348
|
||
Missing commented default access modifier on method 'bad(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L348
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:SimplifyBooleanReturns` L349
|
||
该 if 语句可被替换为返回条件表达式
|
||
建议: 例如 if (x) return true; else return false 应改为 return x;
|
||
- 🟡 `pmd:LogicInversion` L349
|
||
Use opposite operator instead of the logic complement operator.
|
||
- 🟡 `pmd:OnlyOneReturn` L350
|
||
方法应只有唯一出口,且应在最后一条语句
|
||
建议: 将多个 return 改为单出口风格,或使用表达式结果返回。
|
||
- 🟡 `pmd:UseUtilityClass` L359
|
||
所有成员都是静态的,应添加私有构造防止实例化
|
||
建议: 为工具类添加 private 无参构造函数,并将类声明为 final。
|
||
- 🟡 `pmd:MutableStaticState` L360
|
||
不要使用非 final 非私有的静态字段
|
||
建议: 改为 private static final,或通过 getter/setter 控制访问。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L360
|
||
Missing commented default access modifier on field 'counter'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L364
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L365
|
||
Public member 'x' declared in a non-public type
|
||
- 🟡 `pmd:AtLeastOneConstructor` L369
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L370
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:SignatureDeclareThrowsException` L370
|
||
方法/构造函数不应显式抛出 java.lang.Exception
|
||
建议: 抛出具体异常类型,避免宽泛的 Exception。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L375
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L376
|
||
Missing commented default access modifier on method 'bad(boolean)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L376
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:SimplifiedTernary` L377
|
||
三元表达式可以简化
|
||
建议: 例如 return x ? true : false 应改为 return x。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L382
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L383
|
||
Missing commented default access modifier on method 'bad(boolean)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L383
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:SimplifyBooleanExpressions` L384
|
||
布尔表达式包含不必要的比较
|
||
建议: 例如 return x == true 应改为 return x。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L389
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L390
|
||
Missing commented default access modifier on method 'bad(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L390
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:SimplifyBooleanReturns` L391
|
||
This if statement can be replaced by `return {condition};`
|
||
- 🟡 `pmd:OnlyOneReturn` L392
|
||
A method should have only one exit point, and that should be the last statement in the method
|
||
- 🟡 `pmd:AtLeastOneConstructor` L400
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L401
|
||
Missing commented default access modifier on method 'bar(Object)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L401
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:EmptyControlStatement` L402
|
||
存在空的控制语句(if/for/while 等)
|
||
建议: 补充逻辑或删除空语句块。
|
||
- 🟡 `pmd:SimplifyConditional` L402
|
||
instanceof 前不需要检查 null
|
||
建议: 删除 x != null &&,因为 x instanceof List 已覆盖 null 情况。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L408
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:SingularField` L409
|
||
字段可能应改为局部变量
|
||
建议: 如果字段只在一个方法中使用,请改为方法内局部变量。
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L411
|
||
Public member 'foo' declared in a non-public type
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L411
|
||
Parameter 'y' is not assigned and could be declared final
|
||
- 🟡 `pmd:AtLeastOneConstructor` L418
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L419
|
||
Missing commented default access modifier on method 'bad(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L419
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:SwitchDensity` L420
|
||
switch 中语句与分支比例过高
|
||
建议: 将每个 case 的逻辑抽取为独立方法,或使用多态/映射表重构。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L471
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L472
|
||
Missing commented default access modifier on method 'm()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L475
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L477
|
||
Missing commented default access modifier on method 'm()'
|
||
- 🟡 `pmd:UselessOverridingMethod` L477
|
||
重写方法仅调用 super,无实际用途
|
||
建议: 删除该重写方法,让父类方法直接生效。
|
||
- 🟡 `pmd:UseUtilityClass` L483
|
||
All members are static. Consider adding a private no-args constructor to prevent instantiation.
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L484
|
||
Missing commented default access modifier on method 'helper()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L491
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L492
|
||
Public member 'bar' declared in a non-public type
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L492
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:AtLeastOneConstructor` L525
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L526
|
||
Missing commented default access modifier on method 'bar(Object, String)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L526
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L526
|
||
Parameter 'baz' is not assigned and could be declared final
|
||
- 🟡 `pmd:MisplacedNullCheck` L527
|
||
null 检查位置错误,可能引发 NullPointerException
|
||
建议: 先判空再调用方法,例如 a != null && a.equals(baz)。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L536
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L537
|
||
Missing commented default access modifier on method 'bad(int)'
|
||
- 🟡 `pmd:AssignmentInOperand` L538
|
||
避免在操作数中赋值
|
||
建议: 将赋值移到表达式外,单独一行,再参与判断。
|
||
- 🟡 `pmd:UseUtilityClass` L545
|
||
All members are static. Consider adding a private no-args constructor to prevent instantiation.
|
||
- 🟡 `pmd:MutableStaticState` L546
|
||
Do not use non-final non-private static fields
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L546
|
||
Missing commented default access modifier on field 'counter'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L548
|
||
Missing commented default access modifier on constructor 'AssignStatic()'
|
||
- 🟡 `pmd:AssignmentToNonFinalStatic` L549
|
||
构造函数中给非 final 静态字段赋值可能不安全
|
||
建议: 使用实例字段,或通过 static final/初始化块管理静态状态。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L554
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L555
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:SignatureDeclareThrowsException` L555
|
||
A method/constructor should not explicitly throw java.lang.Exception
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L556
|
||
局部变量可声明为 final
|
||
建议: 为只赋值一次的局部变量添加 final 修饰符。
|
||
- 🟡 `pmd:AvoidAccessibilityAlteration` L557
|
||
不应使用 setAccessible(true) 修改可见性
|
||
建议: 避免反射破坏封装;若必须,应评估安全风险并限制调用权限。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L562
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L563
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L564
|
||
Local variable 'o' could be declared final
|
||
- 🟡 `pmd:AvoidCallingFinalize` L565
|
||
避免显式调用 finalize() 方法
|
||
建议: 删除显式调用,改用 try-with-resources 或 Cleaner 管理资源。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L570
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L571
|
||
Missing commented default access modifier on field 'd'
|
||
- 🟡 `pmd:AvoidDecimalLiteralsInBigDecimalConstructor` L571
|
||
避免用浮点字面量构造 BigDecimal,可能产生精度问题
|
||
建议: 使用字符串构造:new BigDecimal("0.1")。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L575
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L576
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L583
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L584
|
||
Missing commented default access modifier on method 'bad(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L584
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:AvoidLiteralsInIfCondition` L585
|
||
if 条件中避免使用魔术数字/字面量
|
||
建议: 将 42、5 等常量提取为命名常量。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L592
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L593
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AssignmentInOperand` L596
|
||
Avoid assignment to x in operand
|
||
- 🟡 `pmd:AtLeastOneConstructor` L602
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L603
|
||
Missing commented default access modifier on field 'x'
|
||
- 🟡 `pmd:AvoidUsingOctalValues` L603
|
||
避免使用八进制字面量
|
||
建议: 去掉前导 0,或明确使用 0x/0b 前缀。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L607
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L608
|
||
Missing commented default access modifier on method 'bad(Object, Object)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L608
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L608
|
||
Parameter 'b' is not assigned and could be declared final
|
||
- 🟡 `pmd:EmptyControlStatement` L609
|
||
Empty if statement
|
||
- 🟡 `pmd:AtLeastOneConstructor` L615
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L616
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:UselessPureMethodCall` L618
|
||
调用了纯方法但未使用结果
|
||
建议: 删除该调用,或将结果赋给变量并使用。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L620
|
||
Missing commented default access modifier on method 'doSomething()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L625
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L626
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:UselessPureMethodCall` L627
|
||
Do not call pure method toString if the result is not used.
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L630
|
||
Missing commented default access modifier on method 'doSomething()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L635
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L636
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:CloseResource` L637
|
||
资源使用后应关闭
|
||
建议: 使用 try-with-resources 自动关闭 InputStream 等资源。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L637
|
||
Local variable 'in' could be declared final
|
||
- 🟡 `pmd:CheckSkipResult` L638
|
||
应检查 InputStream.skip() 的返回值
|
||
建议: 将 skip 返回值赋给变量,并判断是否满足所需跳过字节数。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L643
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L644
|
||
Missing commented default access modifier on method 'bad(Collection<String>)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L644
|
||
Parameter 'c' is not assigned and could be declared final
|
||
- 🟡 `pmd:UnusedLocalVariable` L645
|
||
存在未使用的局部变量
|
||
建议: 删除未使用的局部变量,或补全其使用逻辑。
|
||
- 🟡 `pmd:ClassCastExceptionWithToArray` L645
|
||
Collection.toArray() 的使用会抛出 ClassCastException
|
||
建议: 使用 c.toArray(new String[0]) 传入类型化数组。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L650
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L651
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L652
|
||
Local variable 'in' could be declared final
|
||
- 🟡 `pmd:AtLeastOneConstructor` L658
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L659
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:UnusedLocalVariable` L660
|
||
Avoid unused local variables such as 'l'.
|
||
- 🟡 `pmd:UnusedLocalVariable` L661
|
||
Avoid unused local variables such as 'o'.
|
||
- 🟡 `pmd:PrimitiveWrapperInstantiation` L661
|
||
不要使用 new Integer(...),应使用 Integer.valueOf(...)
|
||
建议: 使用装箱缓存或 Integer.valueOf 替代 new Integer。
|
||
- 🟡 `pmd:UnnecessaryBoxing` L661
|
||
存在不必要的显式装箱
|
||
建议: 直接使用基本类型或依赖自动装箱。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L666
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L667
|
||
Missing commented default access modifier on method 'bad(String, String)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L667
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L667
|
||
Parameter 'b' is not assigned and could be declared final
|
||
- 🟡 `pmd:EmptyControlStatement` L668
|
||
Empty if statement
|
||
- 🟡 `pmd:CompareObjectsWithEquals` L668
|
||
比较对象引用应使用 equals() 而不是 ==
|
||
建议: 对非基本类型对象比较使用 equals()。
|
||
- 🟡 `pmd:UseEqualsToCompareStrings` L668
|
||
比较字符串应使用 equals() 而不是 ==
|
||
建议: 使用 a.equals(b),并按需调用 equalsIgnoreCase。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L674
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L675
|
||
Missing commented default access modifier on method 'bad(double)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L675
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:EmptyControlStatement` L676
|
||
Empty if statement
|
||
- 🟡 `pmd:ComparisonWithNaN` L676
|
||
与 NaN 比较恒为 false
|
||
建议: 使用 Double.isNaN(x) 判断 NaN。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L682
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L683
|
||
Missing commented default access modifier on method 'call()'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L686
|
||
Missing commented default access modifier on method 'accept(String[])'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L692
|
||
Missing commented default access modifier on constructor 'CtorCall()'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L695
|
||
Missing commented default access modifier on method 'overridable()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L700
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L701
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:MissingSerialVersionUID` L707
|
||
Classes implementing Serializable should set a serialVersionUID
|
||
- 🟡 `pmd:AtLeastOneConstructor` L707
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:DoNotExtendJavaLangThrowable` L707
|
||
异常不应直接继承 java.lang.Throwable
|
||
建议: 应继承 Exception 或 RuntimeException。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L711
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L712
|
||
Missing commented default access modifier on field 'path'
|
||
- 🟡 `pmd:DoNotHardCodeSDCard` L712
|
||
不要硬编码 /sdcard 路径
|
||
建议: 使用环境变量或上下文 API 获取存储路径。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L716
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L717
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:DoNotTerminateVM` L718
|
||
不应调用 System.exit() 终止 JVM
|
||
建议: 通过受控方式结束应用,或抛出异常交给上层处理。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L723
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L724
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L731
|
||
Missing commented default access modifier on method 'doWork()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L736
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L737
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:DontUseFloatTypeForLoopIndices` L738
|
||
不要使用浮点类型作为循环索引,浮点精度可能导致循环异常
|
||
建议: 改用 int/long 循环变量,或使用 double 并明确终止条件。
|
||
- 🟡 `pmd:EmptyControlStatement` L738
|
||
Empty for statement
|
||
- 🟡 `pmd:AtLeastOneConstructor` L744
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L745
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:EmptyCatchBlock` L748
|
||
避免空 catch 块
|
||
建议: 至少记录日志或做降级处理,不要静默吞掉异常。
|
||
- 🟡 `pmd:AvoidCatchingGenericException` L748
|
||
避免捕获泛化 Exception
|
||
建议: 捕获具体异常类型,如 IOException、IllegalArgumentException。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L751
|
||
Missing commented default access modifier on method 'doWork()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L756
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L757
|
||
Missing commented default access modifier on method 'bad(Object)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L757
|
||
Parameter 'o' is not assigned and could be declared final
|
||
- 🟡 `pmd:EmptyControlStatement` L758
|
||
Empty if statement
|
||
- 🟡 `pmd:AtLeastOneConstructor` L764
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L765
|
||
Missing commented default access modifier on method 'bad(String)'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L773
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L774
|
||
Missing commented default access modifier on method 'bad(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L774
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:IdenticalConditionalBranches` L775
|
||
条件分支完全相同,条件判断无意义
|
||
建议: 删除 if/else,直接返回相同结果或提取公共逻辑。
|
||
- 🟡 `pmd:OnlyOneReturn` L776
|
||
A method should have only one exit point, and that should be the last statement in the method
|
||
- 🟡 `pmd:AtLeastOneConstructor` L784
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L785
|
||
Missing commented default access modifier on method 'bad(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L785
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:ImplicitSwitchFallThrough` L789
|
||
switch 分支存在隐式 fall-through
|
||
建议: 在 case 末尾补上 break/return,或添加注释明确故意 fall-through。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L799
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L800
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:UnusedLocalVariable` L801
|
||
Avoid unused local variables such as 'c'.
|
||
- 🟡 `pmd:PrimitiveWrapperInstantiation` L801
|
||
Do not use `new Integer(...)`, prefer `Integer.valueOf(...)`
|
||
- 🟡 `pmd:AtLeastOneConstructor` L806
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L807
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:ForLoopVariableCount` L808
|
||
for 循环中控制变量过多
|
||
建议: 拆分循环或将额外变量移到循环外,保持循环头简洁。
|
||
- 🟡 `pmd:AvoidReassigningLoopVariables` L809
|
||
避免修改循环控制变量
|
||
建议: 不要在循环体内或内层循环更新外层循环变量,使用独立变量。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L815
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:MethodWithSameNameAsEnclosingClass` L816
|
||
方法与包含它的类同名(可能误当构造函数)
|
||
建议: 重命名方法,避免与类名混淆。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L816
|
||
Missing commented default access modifier on method 'SameName()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L821
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L822
|
||
Missing commented default access modifier on method 'bad(String)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L822
|
||
Parameter 's' is not assigned and could be declared final
|
||
- 🟡 `pmd:EmptyControlStatement` L823
|
||
Empty if statement
|
||
- 🟡 `pmd:MissingStaticMethodInNonInstantiatableClass` L829
|
||
Class cannot be instantiated and does not provide any static methods or fields
|
||
- 🟡 `pmd:UnusedPrivateField` L836
|
||
Avoid unused private fields such as 'LOG1'.
|
||
- 🟡 `pmd:UnusedPrivateField` L837
|
||
Avoid unused private fields such as 'LOG2'.
|
||
- 🟡 `pmd:AtLeastOneConstructor` L841
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:NonStaticInitializer` L842
|
||
非静态初始化器令人困惑
|
||
建议: 将初始化逻辑移到构造函数或工厂方法中。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L848
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L849
|
||
Missing commented default access modifier on field 's'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L850
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:NullAssignment` L851
|
||
将对象赋值为 null 是代码坏味道
|
||
建议: 用 Optional 或空集合/空对象模式替代 null 赋值。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L856
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:OverrideBothEqualsAndHashcode` L857
|
||
重写 equals() 时应同时重写 hashCode()
|
||
建议: 为相等的对象保证 hashCode 一致,避免集合类行为异常。
|
||
- 🟡 `pmd:MissingOverride` L857
|
||
重写方法缺少 @Override 注解
|
||
建议: 在继承或实现的方法上添加 @Override 注解。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L863
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:MissingOverride` L864
|
||
The method 'compareTo(CmpOnly)' is missing an @Override annotation.
|
||
- 🟡 `pmd:OverrideBothEqualsAndHashCodeOnComparable` L864
|
||
实现 Comparable 时应同时重写 equals() 和 hashCode()
|
||
建议: 保持 compareTo、equals、hashCode 三者语义一致。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L870
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L871
|
||
Missing commented default access modifier on field 'c'
|
||
- 🟡 `pmd:ReplaceJavaUtilCalendar` L871
|
||
应使用 java.time 替代 java.util.Calendar
|
||
建议: 使用 LocalDate/LocalDateTime/ZonedDateTime 等新时间 API。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L875
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L876
|
||
Missing commented default access modifier on field 'd'
|
||
- 🟡 `pmd:ReplaceJavaUtilDate` L876
|
||
应使用 java.time 替代 java.util.Date
|
||
建议: 使用 Instant/LocalDateTime 并配合 DateTimeFormatter 处理格式。
|
||
- 🟡 `pmd:ReplaceJavaUtilDate` L876
|
||
Usage of java.util.Date should be replaced with classes from java.time
|
||
- 🟡 `pmd:AtLeastOneConstructor` L880
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L881
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L887
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L888
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:OnlyOneReturn` L890
|
||
A method should have only one exit point, and that should be the last statement in the method
|
||
- 🟡 `pmd:ReturnFromFinallyBlock` L892
|
||
避免在 finally 块中返回值
|
||
建议: 从 try/catch 中返回结果,finally 只做资源清理。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L898
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:AvoidFieldNameMatchingTypeName` L899
|
||
字段名与类名相同容易混淆
|
||
建议: 重命名字段,例如 sdf 改为 dateFormat。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L899
|
||
Missing commented default access modifier on field 'sdf'
|
||
- 🟡 `pmd:SimpleDateFormatNeedsLocale` L899
|
||
SimpleDateFormat 实例化时应指定 Locale
|
||
建议: new SimpleDateFormat("yyyy-MM-dd", Locale.ROOT)。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L903
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:AvoidStringBufferField` L904
|
||
StringBuffer 字段可能造成内存问题
|
||
建议: 优先使用 StringBuilder,并避免在长生命周期对象中持有大缓冲区。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L904
|
||
Missing commented default access modifier on field 'sb'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L908
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L909
|
||
Missing commented default access modifier on method 'equals(String)'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L914
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L915
|
||
Missing commented default access modifier on method 'hashcode()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L920
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L921
|
||
Missing commented default access modifier on field 's'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L925
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L926
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:UnconditionalIfStatement` L927
|
||
不要使用恒真/恒假的 if 语句
|
||
建议: 删除无条件 if,直接执行其中的代码或删除整个语句块。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L934
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L935
|
||
Missing commented default access modifier on method 'bad(String)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L935
|
||
Parameter 's' is not assigned and could be declared final
|
||
- 🟡 `pmd:EmptyControlStatement` L936
|
||
Empty if statement
|
||
- 🟡 `pmd:AtLeastOneConstructor` L942
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L943
|
||
Missing commented default access modifier on method 'bad(int)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L943
|
||
Parameter 'x' is not assigned and could be declared final
|
||
- 🟡 `pmd:UnusedLocalVariable` L944
|
||
Avoid unused local variables such as 's'.
|
||
- 🟡 `pmd:UnnecessaryConversionTemporary` L944
|
||
避免不必要的临时转换对象
|
||
建议: 使用 String.valueOf(x) 替代 new Integer(x).toString()。
|
||
- 🟡 `pmd:PrimitiveWrapperInstantiation` L944
|
||
Do not use `new Integer(...)`, prefer `Integer.valueOf(...)`
|
||
- 🟡 `pmd:AtLeastOneConstructor` L949
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L950
|
||
Missing commented default access modifier on field 's'
|
||
- 🟡 `pmd:OverrideBothEqualsAndHashcode` L951
|
||
Ensure you override both equals() and hashCode()
|
||
- 🟡 `pmd:MissingOverride` L951
|
||
The method 'equals(Object)' is missing an @Override annotation.
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L951
|
||
Parameter 'o' is not assigned and could be declared final
|
||
- 🟡 `pmd:EmptyControlStatement` L952
|
||
Empty if statement
|
||
- 🟡 `pmd:AtLeastOneConstructor` L959
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L960
|
||
Missing commented default access modifier on method 'bad(String, String)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L960
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L960
|
||
Parameter 'b' is not assigned and could be declared final
|
||
- 🟡 `pmd:CompareObjectsWithEquals` L961
|
||
Use equals() to compare object references.
|
||
- 🟡 `pmd:UseEqualsToCompareStrings` L961
|
||
Use equals() to compare strings instead of '==' or '!='
|
||
- 🟡 `pmd:AtLeastOneConstructor` L966
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L967
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:UselessPureMethodCall` L968
|
||
Do not call pure method length if the result is not used.
|
||
- 🟡 `pmd:AtLeastOneConstructor` L973
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L974
|
||
Missing commented default access modifier on method 'bad(String)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L974
|
||
Parameter 's' is not assigned and could be declared final
|
||
- 🟡 `pmd:UselessPureMethodCall` L975
|
||
Do not call pure method toUpperCase if the result is not used.
|
||
- 🟡 `pmd:UseLocaleWithCaseConversions` L975
|
||
toUpperCase()/toLowerCase() 应指定 Locale
|
||
建议: 使用 s.toUpperCase(Locale.ROOT) 或指定业务 locale。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L980
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L981
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:UnusedLocalVariable` L982
|
||
Avoid unused local variables such as 'cl'.
|
||
- 🟡 `pmd:UseProperClassLoader` L982
|
||
getClassLoader() 在 J2EE 中可能不符合预期
|
||
建议: 使用 Thread.currentThread().getContextClassLoader()。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L987
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:AvoidFieldNameMatchingMethodName` L988
|
||
字段名与同名方法容易混淆
|
||
建议: 重命名字段或方法,避免同名歧义。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L988
|
||
Missing commented default access modifier on field 'value'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L990
|
||
Missing commented default access modifier on method 'value()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L995
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:AvoidFieldNameMatchingTypeName` L996
|
||
It is somewhat confusing to have a field name matching the declaring class name
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L996
|
||
Missing commented default access modifier on field 'TypeName'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1000
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1001
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AvoidCatchingGenericException` L1004
|
||
Avoid catching Exception in try-catch block
|
||
- 🟡 `pmd:EmptyControlStatement` L1005
|
||
Empty if statement
|
||
- 🟡 `pmd:AvoidInstanceofChecksInCatchClause` L1005
|
||
catch 块中不应使用 instanceof 判断异常类型
|
||
建议: 为每种异常类型增加独立的 catch 子句。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1009
|
||
Missing commented default access modifier on method 'doWork()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1014
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1015
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1016
|
||
Local variable 'x' could be declared final
|
||
- 🟡 `pmd:TooFewBranchesForSwitch` L1017
|
||
switch 分支少于三个,使用 if 更高效
|
||
建议: 将 switch 改为 if/else if 判断。
|
||
- 🟡 `pmd:NonExhaustiveSwitch` L1017
|
||
switch 不完整,应包含 default 或所有枚举分支
|
||
建议: 补充 default 分支处理未知情况。
|
||
- 🟡 `pmd:NonCaseLabelInSwitch` L1020
|
||
switch 中出现了非 case 标签
|
||
建议: 移除标签,或重构 switch 逻辑。
|
||
- 🟡 `pmd:UnusedLabel` L1020
|
||
存在未使用的标签
|
||
建议: 删除未引用标签,避免误导。
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1035
|
||
Public member 'getInstance' declared in a non-public type
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1039
|
||
Public member 'getInstance' declared in a non-public type
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L1039
|
||
Parameter 'obj' is not assigned and could be declared final
|
||
- 🟡 `pmd:VariableCanBeInlined` L1040
|
||
局部变量可以内联,不需要额外存储
|
||
建议: 直接返回值或表达式,减少中间变量。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1040
|
||
Local variable 's' could be declared final
|
||
- 🟡 `pmd:SignatureDeclareThrowsException` L1047
|
||
A method/constructor should not explicitly throw java.lang.Exception
|
||
- 🟡 `pmd:UnsupportedJdkApiUsage` L1048
|
||
使用了不受支持的 JDK API(如 sun.misc.Unsafe)
|
||
建议: 改用标准 JDK API,例如 VarHandle/Atomic 类或通过受支持方式获取 Unsafe。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1053
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1054
|
||
Missing commented default access modifier on method 'bar()'
|
||
- 🟡 `pmd:IdempotentOperations` L1056
|
||
存在幂等操作(如变量赋值给自身/重复转换)
|
||
建议: 删除重复或自我赋值,保留一次有效操作。
|
||
- 🟡 `pmd:UnusedAssignment` L1056
|
||
The value assigned to variable 'x' is never used
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1061
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1062
|
||
Public member 'hashcode' declared in a non-public type
|
||
- 🟡 `pmd:SuspiciousHashcodeMethodName` L1062
|
||
方法名与 hashCode() 高度相似,但签名不符
|
||
建议: 重命名为 hashcode -> hashCode,并返回 int 且加上 @Override。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1068
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1069
|
||
Missing commented default access modifier on method 'foo()'
|
||
- 🟡 `pmd:SuspiciousOctalEscape` L1070
|
||
字符串中的八进制转义后紧跟数字字符很可疑
|
||
建议: 将转义拆分或改用 Unicode 转义,避免歧义。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1075
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1076
|
||
Missing commented default access modifier on method 'bad(String)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L1076
|
||
Parameter 'buz' is not assigned and could be declared final
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1077
|
||
Local variable 'answer' could be declared final
|
||
- 🟡 `pmd:LiteralsFirstInComparisons` L1077
|
||
字符串比较时应将字面量放在前面
|
||
建议: 使用 "BAZ".equals(buz) 避免 NPE。
|
||
- 🟡 `pmd:UnnecessaryCaseChange` L1077
|
||
使用 toUpperCase/toLowerCase().equals() 不如 equalsIgnoreCase 清晰
|
||
建议: 改为 s1.equalsIgnoreCase(s2)。
|
||
- 🟡 `pmd:UseLocaleWithCaseConversions` L1077
|
||
When doing a String.toLowerCase()/toUpperCase() call, use a Locale
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1083
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1084
|
||
Public member 'method1' declared in a non-public type
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1087
|
||
Public member 'method' declared in a non-public type
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L1087
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:UnusedNullCheckInEquals` L1088
|
||
equals() 中的 null 检查未被使用或位置不当
|
||
建议: 直接调用非空对象.equals(),或先用 Objects.equals() 统一判空。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1095
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1097
|
||
Missing commented default access modifier on method 'bar()'
|
||
- 🟡 `pmd:AvoidCatchingGenericException` L1100
|
||
Avoid catching Exception in try-catch block
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1104
|
||
Missing commented default access modifier on method 'doWork()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1109
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1111
|
||
Missing commented default access modifier on method 'bar()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1118
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1119
|
||
Missing commented default access modifier on method 'bar()'
|
||
- 🟡 `pmd:AvoidDuplicateLiterals` L1120
|
||
字符串字面量重复出现多次
|
||
建议: 提取为常量,避免重复字符串字面量。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1125
|
||
Missing commented default access modifier on method 'buz(String)'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1130
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1131
|
||
Missing commented default access modifier on method 'foo()'
|
||
- 🟡 `pmd:JumbledIncrementer` L1133
|
||
内层循环修改了外层循环的递增变量,循环逻辑混乱
|
||
建议: 确保内层循环更新自己的控制变量,不要更新外层循环变量。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1133
|
||
Local variable 'k' could be declared final
|
||
- 🟡 `pmd:AvoidReassigningLoopVariables` L1133
|
||
Avoid reassigning the loop control variable 'i'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1141
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1142
|
||
Missing commented default access modifier on method 'foo()'
|
||
- 🟡 `pmd:AvoidLiteralsInIfCondition` L1144
|
||
Avoid using literals such as 5 in if statements
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1152
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1153
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1154
|
||
Local variable 'numbers' could be declared final
|
||
- 🟡 `pmd:CollectionTypeMismatch` L1155
|
||
集合操作使用了与泛型类型不匹配的对象
|
||
建议: 确保存入/取出/删除的元素类型与泛型一致,例如用 Integer 而不是 String。
|
||
- 🟡 `pmd:UseConcurrentHashMap` L1156
|
||
并发访问场景应使用 ConcurrentHashMap
|
||
建议: 将 HashMap 改为 ConcurrentHashMap,或同步访问。
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1156
|
||
Local variable 'map' could be declared final
|
||
- 🟡 `pmd:UselessPureMethodCall` L1157
|
||
Do not call pure method get if the result is not used.
|
||
- 🟡 `pmd:CollectionTypeMismatch` L1157
|
||
Object of type 'int' cannot be in collection expecting 'java.lang.String'
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1158
|
||
Local variable 'names' could be declared final
|
||
- 🟡 `pmd:UselessPureMethodCall` L1159
|
||
Do not call pure method contains if the result is not used.
|
||
- 🟡 `pmd:CollectionTypeMismatch` L1159
|
||
Object of type 'int' cannot be in collection expecting 'java.lang.String'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1164
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1165
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1165
|
||
Missing commented default access modifier on nested class 'C'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1166
|
||
Missing commented default access modifier on method 'varargs(Object[])'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1167
|
||
Missing commented default access modifier on method 'call()'
|
||
- 🟡 `pmd:ConfusingArgumentToVarargsMethod` L1168
|
||
可变参数调用意图不清晰
|
||
建议: 显式转换为 Object 或 Object[],或直接展开参数,避免歧义。
|
||
- 🟡 `pmd:ConfusingArgumentToVarargsMethod` L1169
|
||
Unclear if a varargs or non-varargs call is intended. Cast to Object or Object[] to clarify intent.
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1175
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1176
|
||
Missing commented default access modifier on method 'bar(Object, String)'
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L1176
|
||
Parameter 'a' is not assigned and could be declared final
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L1176
|
||
Parameter 'baz' is not assigned and could be declared final
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1184
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:UnusedPrivateField` L1186
|
||
Avoid unused private fields such as 'stream'.
|
||
- 🟡 `pmd:NonSerializableClass` L1186
|
||
可序列化类包含不可序列化的字段
|
||
建议: 将该字段标记为 transient,或改为可序列化类型。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1190
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1191
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1198
|
||
Missing commented default access modifier on method 'doWork()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1204
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1205
|
||
Missing commented default access modifier on method 'bad()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1215
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1216
|
||
Missing commented default access modifier on method 'foo()'
|
||
- 🟡 `pmd:AvoidLiteralsInIfCondition` L1219
|
||
Avoid using literals such as 25 in if statements
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1228
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1229
|
||
Missing commented default access modifier on method 'foo()'
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1230
|
||
Local variable 'i' could be declared final
|
||
- 🟡 `pmd:LocalVariableCouldBeFinal` L1231
|
||
Local variable 'b' could be declared final
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1237
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1238
|
||
Public member 'bar' declared in a non-public type
|
||
- 🟡 `pmd:MethodArgumentCouldBeFinal` L1238
|
||
Parameter 'string' is not assigned and could be declared final
|
||
- 🟡 `pmd:LiteralsFirstInComparisons` L1239
|
||
Position literals first in String comparisons
|
||
- 🟡 `pmd:OnlyOneReturn` L1240
|
||
A method should have only one exit point, and that should be the last statement in the method
|
||
- 🟡 `pmd:LiteralsFirstInComparisons` L1242
|
||
Position literals first in String comparisons
|
||
- 🟡 `pmd:OnlyOneReturn` L1243
|
||
A method should have only one exit point, and that should be the last statement in the method
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1252
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1254
|
||
Public member 'clone' declared in a non-public type
|
||
- 🟡 `pmd:CloneMethodReturnTypeMustMatchClassName` L1254
|
||
clone() 返回类型必须与类名一致
|
||
建议: 将 clone() 返回类型改为当前类名。
|
||
- 🟡 `pmd:CloneMethodMustImplementCloneable` L1254
|
||
只有实现 Cloneable 接口才应实现 clone() 方法
|
||
建议: 要么移除 clone() 方法,要么让类实现 Cloneable。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1260
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:CloneMethodReturnTypeMustMatchClassName` L1262
|
||
The return type of the clone() method must be the class name when implements Cloneable
|
||
- 🟡 `pmd:CloneMethodMustBePublic` L1262
|
||
实现 Cloneable 时 clone() 方法必须为 public
|
||
建议: 将 protected clone() 改为 public CloneableType clone()。
|
||
- 🟡 `pmd:OnlyOneReturn` L1264
|
||
A method should have only one exit point, and that should be the last statement in the method
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1272
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1274
|
||
Public member 'clone' declared in a non-public type
|
||
- 🟡 `pmd:CloneMethodReturnTypeMustMatchClassName` L1274
|
||
The return type of the clone() method must be the class name when implements Cloneable
|
||
- 🟡 `pmd:OnlyOneReturn` L1276
|
||
A method should have only one exit point, and that should be the last statement in the method
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1284
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1286
|
||
Public member 'clone' declared in a non-public type
|
||
- 🟡 `pmd:CloneMethodReturnTypeMustMatchClassName` L1286
|
||
The return type of the clone() method must be the class name when implements Cloneable
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1294
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:EmptyFinalizer` L1296
|
||
finalize() 方法为空,没有实际作用
|
||
建议: 删除空 finalize 方法,或使用 Cleaner 清理资源。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1301
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:FinalizeDoesNotCallSuperFinalize` L1304
|
||
finalize() 方法应最后调用 super.finalize()
|
||
建议: 在 finalize() 末尾添加 super.finalize()。
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1306
|
||
Missing commented default access modifier on method 'cleanup()'
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1311
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:FinalizeOnlyCallsSuperFinalize` L1313
|
||
finalize() 只调用 super.finalize(),没有实际清理逻辑
|
||
建议: 删除无意义的 finalize,或在其中加入真正的资源清理逻辑。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1319
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:FinalizeOnlyCallsSuperFinalize` L1320
|
||
Finalize should do something besides just calling super.finalize()
|
||
- 🟡 `pmd:MissingOverride` L1320
|
||
The method 'finalize()' is missing an @Override annotation.
|
||
- 🟡 `pmd:FinalizeOverloaded` L1323
|
||
finalize 方法不应被重载
|
||
建议: 删除重载的 finalize(int) 方法。
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1328
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:FinalizeOnlyCallsSuperFinalize` L1330
|
||
Finalize should do something besides just calling super.finalize()
|
||
- 🟡 `pmd:FinalizeShouldBeProtected` L1330
|
||
finalize() 应声明为 protected
|
||
建议: 将 public finalize() 改为 protected finalize()。
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1330
|
||
Public member 'finalize' declared in a non-public type
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1338
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:ProperLogger` L1339
|
||
logger 应定义为 private static final,并持有正确的类
|
||
建议: 改为 private static final Logger LOG = LoggerFactory.getLogger(Class.class);
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1343
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:ProperLogger` L1344
|
||
Logger should be defined private static final and have the correct class
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1345
|
||
Missing commented default access modifier on method 'bar()'
|
||
- 🟡 `pmd:AvoidCatchingGenericException` L1348
|
||
Avoid catching Exception in try-catch block
|
||
- 🟡 `pmd:CommentDefaultAccessModifier` L1352
|
||
Missing commented default access modifier on method 'doWork()'
|
||
- 🟡 `pmd:MissingSerialVersionUID` L1359
|
||
Classes implementing Serializable should set a serialVersionUID
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1359
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:UnusedPrivateField` L1360
|
||
Avoid unused private fields such as 'value'.
|
||
- 🟡 `pmd:AtLeastOneConstructor` L1364
|
||
Each class should declare at least one constructor
|
||
- 🟡 `pmd:UnusedPrivateField` L1366
|
||
Avoid unused private fields such as 'nonSerializableField'.
|
||
- 🟡 `pmd:ImmutableField` L1366
|
||
Field 'nonSerializableField' may be declared final
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1378
|
||
Public member 'getInstance' declared in a non-public type
|
||
- 🟡 `pmd:PublicMemberInNonPublicType` L1390
|
||
Public member 'getInstance' declared in a non-public type
|
||
- 🟡 `pmd:NonThreadSafeSingleton` L1391
|
||
单例实现不是线程安全的
|
||
建议: 使用 enum 单例、静态持有者(holder)或双重检查加 volatile。
|
||
- 🔵 `pmd:UnnecessaryFullyQualifiedName` L402
|
||
不必要使用全限定名
|
||
建议: 使用已导入的简单类名代替全限定名。
|
||
- 🔵 `pmd:DoNotThrowExceptionInFinally` L727
|
||
在 finally 块中抛出异常会使控制流难以理解
|
||
建议: 不要在 finally 中抛出异常,先记录或吞掉 finally 中的异常。
|
||
- 🔵 `pmd:InstantiationToGetClass` L801
|
||
不要仅为获取 Class 对象而实例化
|
||
建议: 使用 Integer.class 而不是 new Integer(1).getClass()。
|
||
- 🔵 `pmd:StringBufferInstantiationWithChar` L904
|
||
new StringBuffer(char) 会把 char 隐式转为 int 容量
|
||
建议: 使用 new StringBuffer() 或 new StringBuffer("c") 明确意图。
|
||
- 🔵 `pmd:InvalidLogMessageFormat` L1112
|
||
日志消息格式参数数量不匹配
|
||
建议: 修正占位符数量:一个 {} 对应一个参数。
|
||
- 🔵 `pmd:InvalidLogMessageFormat` L1113
|
||
Too many arguments, expected 1 argument but found 2
|
||
- 🔵 `pmd:UnnecessaryFullyQualifiedName` L1184
|
||
Unnecessary qualifier 'java.io': 'Serializable' is already in scope because it is imported in this file
|
||
|
||
AI 审查 · 9 条建议
|
||
|
||
- 🔴 [AI] [bug] `rethrow-missing-throws` L48
|
||
**捕获 IOException 后重新抛出但方法未声明 throws IOException,编译失败**
|
||
ReThrow.bad() 中 catch (IOException e) 后直接 throw e,但 bad() 没有 throws IOException,无法编译。
|
||
建议: 在方法签名上增加 throws IOException,或者更简单:不要捕获该异常,直接让 doWork() 的异常向外传播。
|
||
- 🔴 [AI] [bug] `wrap-same-missing-throws` L61
|
||
**包装 IOException 抛出但方法未声明 throws IOException,编译失败**
|
||
WrapSame.bad() 中 catch 后 throw new IOException(...),但 bad() 未声明 throws IOException,代码无法编译。
|
||
建议: 为 bad() 增加 throws IOException,或捕获后改为抛出一个非受检异常。
|
||
- 🔴 [AI] [bug] `finalize-protected-inaccessible` L565
|
||
**显式调用 Object.finalize() 违反访问控制,无法编译**
|
||
CallFinalize.bad() 中通过 Object 引用调用 o.finalize(),但 Object.finalize() 是 protected 方法,不在同包且不是通过子类引用访问,编译不通过。
|
||
建议: 删除该调用;如果需要清理资源,使用 AutoCloseable/Cleaner。
|
||
- 🔴 [AI] [bug] `null-inputstream-skip-npe` L637
|
||
**InputStream 初始化为 null 后直接调用 skip(),必现 NPE**
|
||
CheckSkip.bad() 中 InputStream in = null,随后调用 in.skip(10),运行时必然抛出 NullPointerException。
|
||
建议: 初始化真实流,并用 try-with-resources 管理生命周期,同时检查 skip 返回值。
|
||
- 🔴 [AI] [performance] `infinite-loop-inner-increment` L1133
|
||
**内层循环误递增外层变量 i,且 k 永不变,导致无限循环**
|
||
JumbledInc.foo() 的内层循环 for (int k = 0; k < 20; i++) 更新的是 i 而不是 k,k 恒为 0,内层循环永不退出,程序将挂起。
|
||
建议: 内层循环应递增自己的控制变量 k。
|
||
- 🟡 [AI] [design] `bean-getter-setter-naming` L317
|
||
**getter/setter 未遵循 JavaBean 命名规范,影响框架绑定**
|
||
BadBean 中 getname/setname 不符合 JavaBean 规范,应为 getName/setName,否则很多序列化/绑定框架无法识别。
|
||
建议: 将 getter 改为 getName(),setter 改为 setName(String name)。
|
||
- 🟡 [AI] [security] `singleton-cast-classcastexception` L1039
|
||
**重载 getInstance(Object) 中无类型检查直接强转,会抛 ClassCastException**
|
||
SingletonDemo.getInstance(Object obj) 直接 (SingletonDemo) obj,传入非 SingletonDemo 对象时抛出 ClassCastException,且该重载破坏了单例语义。
|
||
建议: 删除该重载方法;如果确需接收对象,应先 instanceof 校验后再处理。
|
||
- 🟡 [AI] [bug] `log-exception-as-string` L1101
|
||
**日志只输出异常的 toString,丢失堆栈信息**
|
||
CorrectLog.bar() 中 _LOG.error(String.valueOf(e)) 只记录异常字符串,无法看到堆栈;应把异常对象作为最后一个参数传给日志 API。
|
||
建议: 使用 _LOG.error("doWork failed", e),保留异常堆栈。
|
||
- 🟡 [AI] [bug] `loop-break-on-first-iteration` L1222
|
||
**循环第一次迭代就 break,后续逻辑成为死代码**
|
||
BranchLastInLoop.foo() 中 if (i > 25) 永远不成立(i 最大为 9),而循环体末尾的 break 无条件执行,导致循环只执行一次。
|
||
建议: 检查循环终止条件,删除多余的 break,或把 break 放入有意义的条件判断中。
|