web-dev-qa-db-fra.com

Avertissements d'analyse des anomalies de flux de données de PMD

J'utilise Eclipse avec la PMD Plug-in (4.0.0.v20130510-1000) et j'obtiens beaucoup de ces violations:

Found 'DD'-anomaly for variable 'freq' (lines '187'-'189').
Found 'DU'-anomaly for variable 'freq' (lines '189'-'333').

Dans this SO answer, il est dit que ces anomalies sont liées à l'attribution de valeurs qui ne sont jamais lues. Mais j'obtiens les violations par exemple dans ce cas:

// here I get a DD anomaly
double freq = 0;
try {
  // here I get a DU anomaly
  freq = Double.parseDouble(getFrequencyTextField().getText());
} catch (final NumberFormatException e) {
  Log.e(e.getMessage());
}
if (freq < 10E6) doSomething();

Si je supprime l'initialisation et ajoute un freq = 0; ligne dans le bloc catch, l'anomalie DD disparaît, mais j'obtiens une anomalie DU sur les deux affectations.

Maintenant ma question: comment suis-je censé gérer cela? Quelle serait la solution préférée de PMD? Et qu'est-ce que cette règle essaie exactement d'empêcher (c'est-à-dire pourquoi est-ce une mauvaise pratique)?

19
brimborium
double freq; // (1)
try {
  // here I get a DU anomaly
  freq = Double.parseDouble(getFrequencyTextField().getText());
} catch (final NumberFormatException e) {
  Log.e(e.getMessage());
  freq = 0; // (2)
}
if (freq < 10E6) doSomething();

Le premier problème est que dans le catch, l'affectation parseDouble n'est pas effectuée sur freq. Sur une freq d'exception serait toujours 0. Peut-être flaggable. Donc, il disparaît lors de l'attribution de freq à l'intérieur de catch.

Lors de l'affectation à freq dans la capture, (2), l'affectation initiale, (1), ne serait jamais lue, donc seule une déclaration suffit.

En ce qui concerne un meilleur style:

try {
  // here I get a DU anomaly
  double freq = Double.parseDouble(getFrequencyTextField().getText());

  if (freq < 10E6) doSomething();
  ...

} catch (final NumberFormatException e) {
  Log.e(e.getMessage());
}

Ou suivez la réponse de @JoachimSauer, en utilisant une double conversion qui ne lève pas d'exception. L'enregistrement indique un niveau de gravité de préférence au style ci-dessus. La journalisation à l'intérieur d'une simple fonction de conversion en cas d'erreur peut ne pas être un bon style: trop de journalisation, journalisation ignorée (?), Difficile à réparer.

20
Joop Eggen

Vous pouvez contourner ce problème (et séparer les préoccupations un peu plus clairement) en extrayant l'analyse syntaxique dans une méthode distincte:

double freq = parseDouble(getFrequencyTextField().getText());

// later in the class (or in a utility class):

public static double parseDouble(final String input) {
  try {
    return Double.parseDouble(input);
  } catch (final NumberFormatException e) {
    Log.e(e.getMessage());
    return 0;
  }
}

Et si vous avez des valeurs par défaut différentes, vous pouvez également ajouter une version à deux arguments: public static double parseDouble(final String input, final double defaultValue).

3
Joachim Sauer