2012-05-25 22 views
6

Aquí es una pieza de código todo lo que hemos escrito:DD anomalía y limpieza de los recursos de la base de datos: ¿hay una solución limpia?

 
    public CustomerTO getCustomerByCustDel(final String cust, final int del) 
      throws SQLException { 
     final PreparedStatement query = getFetchByCustDel(); 
     ResultSet records = null; 
     try { 
      query.setString(1, cust); 
      query.setInt(2, del); 
      records = query.executeQuery(); 

      return this.getCustomer(records); 
     } finally { 
      if (records != null) { 
       records.close(); 
      } 
      query.close(); 
     } 
    } 

Si se omite el bloque 'finalmente', entonces se deja colgando recursos de bases de datos, lo que obviamente es un problema potencial. Sin embargo, si hace lo que he hecho aquí, configure ResultSet para que anule fuera del bloque ** try ** y luego configúrelo en el valor deseado dentro del bloque - PMD informa una 'anomalía DD'. En la documentación, una anomalía DD se describe de la siguiente manera:

DataflowAnomalyAnalysis: El análisis de flujo de datos rastrea definiciones locales, indefiniciones y referencias a variables en diferentes rutas en el flujo de datos. De esas informaciones se pueden encontrar varios problemas. [...] DD - Anomalía: una variable recientemente definida se redefine. Esto es ominoso, pero no tiene por qué ser un error.

Si se declara el conjunto de resultados fuera del bloque sin establecer un valor, que con razón obtiene un error de 'variable no podría haber sido inicializado' cuando hace lo si (registros! = Null) prueba.

Ahora, en mi opinión, mi uso aquí no es un error. Pero, ¿hay alguna forma de reescribir limpiamente que no active la advertencia PMD? En particular, no quiero deshabilitar la regla DataFlowAnomalyAnalysis de PMD, ya que la identificación de anomalías de UR y DU sería realmente útil; pero estas anomalías DD me hacen sospechar que podría estar haciendo algo mejor, y, si no hay una mejor manera de hacerlo, son un montón (y tal vez debería revisar si puedo reescribir la regla PMD)

Respuesta

2

Creo esto es más claro:

PreparedStatement query = getFetchByCustDel(); 
try { 
    query.setString(1, cust); 
    query.setInt(2, del); 
    ResultSet records = query.executeQuery(); 
    try { 
     return this.getCustomer(records); 
    } finally { 
     records.close(); 
    } 
} finally { 
    query.close(); 
} 

Además, en su versión de la consulta no quede cerrado si records.close() lanza una excepción.

1

creo que esa nota DD anomalía es más errores, que una característica
Además, la forma de liberar recursos es un poco incompleta, por ejemplo

PreparedStatement pstmt = null; 
Statement st = null; 

try { 
    ... 
} catch (final Exception e) { 
    ... 
} finally { 
    try{ 
     if (pstmt != null) { 
      pstmt.close(); 
     } 
    } catch (final Exception e) { 
     e.printStackTrace(System.err); 
    } finally { 
     try { 
      if (st != null) { 
       st.close(); 
      } 
     } catch (final Exception e) { 
      e.printStackTrace(System.err); 
     } 
    } 
} 

otra parte esto no es nuevo a la derecha, primo del que debiera recursos cercanos como ese

PreparedStatement pstmt = null; 
Throwable th = null; 

try { 
    ... 
} catch (final Throwable e) { 
    <something here> 
    th = e; 
    throw e; 
} finally { 
    if (th == null) { 
     pstmt.close(); 
    } else { 
     try { 
      if (pstmt != null) { 
       pstmt.close(); 
      } 
     } catch (Throwable u) { 
     } 
    } 
} 
Cuestiones relacionadas