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