---
name: kd-debug-rules
description: 金蝶调试规则 - NPE/类缺失/DataSet closed/SQL元数据/死锁/OOM/事件递归
alwaysApply: false
---

# 金蝶调试规则

## NullPointerException

- 检查链式调用中的空值：`getForm().getControl()` 中 `getForm()` 可能返回 null
- 金蝶 API 返回值常为 null：`dataEntity.getDataObjects()` 可能返回空数组
- 插件上下文 `this.getView()` 在特定生命周期可能为 null

## ClassNotFoundException / NoClassDefFoundError

- 检查 JAR 依赖是否正确打包到 lib 目录
- 检查类路径冲突：同一类在多个 JAR 中存在
- 企业版 vs 金蝶AI套件 API 差异导致的类缺失

## DataSet is closed

- 在异步操作后访问已关闭的 DataSet
- 解决方案：在关闭前复制数据，或使用 `getDataObjects()` 获取数据列表

## SQL 元数据错误

- 表名/字段名拼写错误
- 数据库方言差异（Oracle vs MySQL vs PostgreSQL）
- 检查 `T_META_OBJECTTYPE` 中的元数据定义

## 死锁

- 检查嵌套事务和锁顺序
- 避免在事务中调用外部服务
- 使用 `@Lock` 注解时注意锁粒度

## OOM

- 检查大对象加载：`getDataObjects()` 无分页
- 检查循环中的对象创建
- 使用 `clearDataObjects()` 释放内存

## 事件递归

- 检查 `propertyChanged` → `setValue` → `propertyChanged` 循环
- 使用标志位避免递归：`if (isUpdating) return;`
