Files
2026Technology-Competition/data/demo-pmd/reports/DesignErrorProne-review.md
T

1708 lines
83 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 代码审查报告
**文件:** `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/RuntimeExceptionError 留给 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 放入有意义的条件判断中。