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)?
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.
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)
.