# 代码审查报告 **文件:** `data\demo-pmd\src\org\example\beans\InvalidBeanDemo.java` **语言:** java **耗时:** 106.9s **分析工具:** pmd --- 总计: 10 | 错误: 1 | 警告: 8 | 建议: 1 静态分析 · 7 个问题 - 🔴 `pmd:SystemPrintln` L30 使用了 System.out / System.err 输出。 建议: 请改用日志框架(如 java.util.logging.Logger、SLF4J)记录输出,以便控制日志级别、格式和输出目标。 - 🟡 `pmd:AtLeastOneConstructor` L7 每个类都应该声明至少一个构造函数。 建议: 请为 MyBean 添加显式的无参构造器,例如 `public MyBean() {}`,以保证符合类的基本构造约定。 - 🟡 `pmd:InvalidJavaBean` L8 Bean 'MyBean' 的属性 'Label' 缺少 setter。 建议: 请为 label 属性添加标准 setter 方法:`public void setLabel(String label) { this.label = label; }`。 - 🟡 `pmd:AtLeastOneConstructor` L16 每个类都应该声明至少一个构造函数。 建议: 请为 WrapException 添加包私有无参构造器,例如 `WrapException() {}`。 - 🟡 `pmd:CommentDefaultAccessModifier` L17 方法 'bar()' 缺少注释掉的默认访问修饰符。 建议: 请在无修饰符方法前添加 `/* default */` 注释,以明确其包私有可见性,如:`/* default */ void bar() { ... }`。 - 🟡 `pmd:AvoidThrowingNewInstanceOfSameException` L21 应避免在 catch 块中仅捕获异常,然后包装成同一类型的新异常并抛出。 建议: 请直接抛出原始异常,例如 `throw se;`,或者包装为具有更明确语义的其他异常类型。 - 🟡 `pmd:CommentDefaultAccessModifier` L24 方法 'doWork()' 缺少注释掉的默认访问修饰符。 建议: 请在无修饰符方法前添加 `/* default */` 注释,如:`/* default */ void doWork() { ... }`。 AI 审查 · 3 条建议 - 🟡 [AI] [design] `bean-not-serializable` L7 **JavaBean 未实现 Serializable** MyBean 作为 JavaBean 未实现 java.io.Serializable,也未声明 serialVersionUID,在需要持久化或会话复制的场景中无法正常序列化。 建议: 为 MyBean 添加 `implements java.io.Serializable` 并声明 `private static final long serialVersionUID = 1L;`。同时建议补充无参构造器(静态分析已要求)和 setter。 - 🟡 [AI] [bug] `unreachable-catch-block` L20 **空方法调用后的 catch 块不可达** doWork() 方法体为空,不会抛出任何异常,因此 bar() 中的 catch (IllegalStateException) 永远不会进入,属于死代码。异常处理流程在当前代码中无效。 建议: 若 doWork() 尚未实现,应删除 try-catch 并直接调用;若 doWork() 可能抛异常,应先补全方法体。建议去掉无意义的相同异常包装。 - 🔵 [AI] [style] `one-top-level-class-per-file` L16 **多个顶层类定义在同一个源文件中** MyBean、WrapException、BeansMain 三个顶层类写在同一个 .java 文件中,使文件职责不单一,降低可读性和可维护性。 建议: 将 WrapException 和 BeansMain 分别抽取到独立源文件(WrapException.java、BeansMain.java),并为每个类保留必要的 public/包私有声明。