62 lines
4.6 KiB
Markdown
62 lines
4.6 KiB
Markdown
# 代码审查报告
|
|
|
|
**文件:** `data\demo-pmd\src\com\demo\errorprone\extra\LoggerDemo.java`
|
|
**语言:** java
|
|
**耗时:** 109.8s
|
|
**分析工具:** pmd
|
|
|
|
---
|
|
|
|
总计: 14 | 错误: 3 | 警告: 10 | 建议: 1
|
|
|
|
静态分析 · 11 个问题
|
|
|
|
- 🔴 `pmd:FieldNamingConventions` L11
|
|
第11行:字段名 'LOG' 不符合命名规范 '[a-z][a-zA-Z0-9]*'。
|
|
建议: 将字段名从大写 `LOG` 改为小驼峰 `log`,例如:`protected Log log = LogFactory.getLog(BadLogger.class);`。
|
|
- 🔴 `pmd:FieldNamingConventions` L16
|
|
第16行:常量名 '_LOG' 不符合命名规范 '[A-Z][A-Z_0-9]*'。
|
|
建议: 将常量名 `_LOG` 改为全大写形式 `LOG`,并同步更新所有引用(如第21行的 `_LOG.error`)。
|
|
- 🔴 `pmd:SystemPrintln` L30
|
|
第30行:在代码中使用了 System.out/err。
|
|
建议: 应使用日志框架替代 `System.out.println`,例如:`LogFactory.getLog(LoggerMain.class).info("demo logger");`,以便统一管理日志输出和级别。
|
|
- 🟡 `pmd:AtLeastOneConstructor` L10
|
|
第10行:每个类应至少声明一个构造器。
|
|
建议: 请为 BadLogger 类添加显式构造器,例如 `public BadLogger() {}`。如果该类设计为不可实例化的工具类,则声明私有构造器。
|
|
- 🟡 `pmd:ProperLogger` L11
|
|
第11行:Logger 应定义为 private static final,并使用正确的类。
|
|
建议: 将 logger 字段修改为 `private static final Log LOG = LogFactory.getLog(BadLogger.class);`,确保字段是私有的、静态的、final 的且类型参数为当前类。
|
|
- 🟡 `pmd:AtLeastOneConstructor` L15
|
|
第15行:每个类应至少声明一个构造器。
|
|
建议: 为 CorrectExceptionLog 类添加显式构造器,例如 `public CorrectExceptionLog() {}`,或如果不需要实例化则声明为 private。
|
|
- 🟡 `pmd:ProperLogger` L16
|
|
第16行:Logger 应定义为 private static final,并使用正确的类。
|
|
建议: 将 `_LOG` 字段重命名为 `LOG`,并确保声明为 `private static final Log LOG = LogFactory.getLog(CorrectExceptionLog.class);`。
|
|
- 🟡 `pmd:CommentDefaultAccessModifier` L17
|
|
第17行:方法 'bar()' 缺少默认访问修饰符的注释。
|
|
建议: 为包级私有方法添加注释 `/* package */`,或显式声明 `public`、`protected`、`private` 修饰符。
|
|
- 🟡 `pmd:AvoidCatchingGenericException` L20
|
|
第20行:避免在 try-catch 块中捕获 Exception 这类通用异常。
|
|
建议: 应改为捕获可能抛出的具体异常类型(如 `IllegalStateException`),或使用多 `catch` 分别处理不同的特定异常,避免使用 `catch (Exception e)`。
|
|
- 🟡 `pmd:UseCorrectExceptionLogging` L21
|
|
第21行:记录异常时使用了不正确的日志语句。
|
|
建议: 应使用带消息和异常对象的重载方法,例如 `_LOG.error("Failed to do work", e);`,确保异常堆栈被记录。
|
|
- 🟡 `pmd:CommentDefaultAccessModifier` L24
|
|
第24行:方法 'doWork()' 缺少默认访问修饰符的注释。
|
|
建议: 为包级私有方法添加注释 `/* package */`,或显式声明访问修饰符。
|
|
|
|
AI 审查 · 3 条建议
|
|
|
|
- 🟡 [AI] [bug] `exception-swallowed` L20
|
|
**捕获异常后仅记录日志,未进行任何错误处理**
|
|
在 CorrectExceptionLog.bar() 中,catch 块捕获所有 Exception 后仅调用 _LOG.error(e) 记录日志,没有恢复、补偿或重新抛出异常。这会导致异常被静默吞没,调用方无法感知失败,程序可能继续在错误状态下运行,掩盖潜在缺陷。
|
|
建议: 根据业务场景处理异常:如果可恢复,则执行补偿逻辑;如果不可恢复,应记录日志后重新抛出,或在方法签名中声明抛出。推荐改为 `catch (Exception e) { log.error("Failed to do work", e); throw new RuntimeException(e); }`,并尽可能捕获更具体的异常类型。
|
|
- 🟡 [AI] [bug] `empty-method` L24
|
|
**doWork() 方法为空实现,调用无效果**
|
|
CorrectExceptionLog.doWork() 方法体为空,未执行任何操作。若 bar() 调用它,会静默成功但不产生任何效果,容易让调用方误以为工作已完成,属于不完整实现或占位代码。
|
|
建议: 实现 doWork() 的具体业务逻辑;如果尚未完成,应抛出 UnsupportedOperationException 或添加明确的 TODO 注释,避免静默空转。
|
|
- 🔵 [AI] [design] `utility-class-instantiable` L28
|
|
**入口类 LoggerMain 缺少私有构造器,可被实例化**
|
|
LoggerMain 是仅包含 main 方法的入口类,默认公有构造器使其可以被外部实例化,产生无意义的对象,暴露不必要的 API 并可能造成混淆。
|
|
建议: 为 LoggerMain 添加私有构造器,阻止实例化:`private LoggerMain() { throw new AssertionError("Utility class"); }`。
|