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

4.6 KiB

代码审查报告

文件: 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 */,或显式声明 publicprotectedprivate 修饰符。
  • 🟡 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"); }