21

私は Eclipse を使用してPMD Plug-in (4.0.0.v20130510-1000)おり、これらの違反がたくさん発生します。

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

このSO 回答では、これらの異常は読み取られない値の割り当てに関連していると述べていますしかし、この場合、たとえば違反が発生します。

// 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();

freq = 0;初期化を削除してブロックに行を追加するとcatch、DD 異常は消えますが、両方の割り当てで DU 異常が発生します。

ここで私の質問: どのように対処すればよいでしょうか? PMD の好ましい解決策は何ですか? そして、このルールは正確に何を防止しようとしているのでしょうか (つまり、なぜそれが悪い慣行なのか)?

4

2 に答える 2

22
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();

最初の問題は、catch で parseDouble の割り当てが freq に行われていないことです。例外でも freq は 0 のままです。 そのため、catch 内で freq に代入すると消えます。

catch で freq に代入する場合 (2)、最初の代入 (1) は読み取られないため、宣言だけで十分です。

より良いスタイルに関して:

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());
}

または、例外をスローしない二重変換を使用して、@ JoachimSauer の回答に従ってください。ロギングは、上記のスタイルを優先して深刻度を示します。エラー時に単純な変換関数内でログを記録するのは、適切なスタイルではない可能性があります。ログが多すぎる、ログが無視される (?)、修復が難しいなどです。

于 2013-05-27T08:17:23.487 に答える
3

解析を別のメソッドに抽出することで、この問題を回避できます (そして懸念をもう少し明確に分離できます)。

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;
  }
}

デフォルト値が異なる場合は、引数が 2 つのバージョンを追加することもできますpublic static double parseDouble(final String input, final double defaultValue)

于 2013-05-27T08:08:52.087 に答える