这是我们都编写的一段代码:
public CustomerTO getCustomerByCustDel(final String cust, final int del) 抛出 SQLException { 最终 PreparedStatement 查询 = getFetchByCustDel(); 结果集记录=空; 尝试 { query.setString(1, cust); query.setInt(2, del); 记录 = query.executeQuery(); 返回 this.getCustomer(records); } 最后 { 如果(记录!= null){ 记录.close(); } 查询.close(); } }
如果省略“finally”块,那么数据库资源就会悬空,这显然是一个潜在问题。但是,如果您按照我在此处所做的操作 - 在 **try** 块外将 ResultSet 设置为 null,然后在块内将其设置为所需的值 - PMD 会报告“DD 异常”。在文档中,DD 异常描述如下:
DataflowAnomalyAnalysis:数据流分析跟踪本地定义、未定义和对数据流不同路径上变量的引用。从这些信息中可以发现各种问题。[...] DD - 异常:重新定义了最近定义的变量。这是不祥之兆,但不一定是错误。
如果您在块外声明 ResultSet 而不设置值,则在执行if (records != null)测试时,您会正确地得到“变量可能尚未初始化”错误。
现在,在我看来,我在这里的使用不是错误。但是有没有一种干净地重写不会触发 PMD 警告的方法?我不是特别想禁用 PMD 的 DataFlowAnomalyAnalysis 规则,因为识别 UR 和 DU 异常实际上很有用;但是这些 DD 异常让我怀疑我可以做得更好——而且,如果没有更好的方法来做到这一点,它们就会变得混乱(我也许应该看看我是否可以重写 PMD 规则)