2013-05-23 31 views
15

私はPMD Plug-in (4.0.0.v20130510-1000)でEclipseを使用して、それらの違反の多くを得るています:thisPMD:DD/DU異常

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

私は初期設定を削除し、catchブロックでfreq = 0;行を追加する場合は、DDは異常消えるが、私は異常の両方の割り当てをDUを得る:しかし、私は、この場合にはインスタンスの違反を取得します。

私の質問:どうしたらいいですか? PMDの好ましい解決策は何でしょうか?そして、このルールは正確に何を防止しようとしていますか(つまり、それは悪い習慣です)?

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つを追加することができます:あなたは別の方法にパースを抽出することにより(もう少し明確にし、別の懸念)この問題を回避することができ

答えて

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

第1の問題は、catchのparseDouble割り当てがfreqに対して行われないことです。 例外的に、周波数は依然として0になります。おそらくフラグ可能です。 catchの中でfreqに代入すると消えます。

catch(2)のfreqに代入すると、inital assignment(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の答えに従ってください。ロギングは上記のスタイルよりも深刻なレベルを示します。エラー時に単純な変換関数内にログを記録すると、スタイルが良くない可能性があります。ロギングが多すぎるか、ロギング(?)が無視され、修復が困難です。

+0

説明のおかげで、それは私のために物事をクリアしました。また、提案に感謝します。私は常にコードスタイルの修正を感謝します。 (そのため、私は最初にPMDを使い始めました。) – brimborium

2

- 案件のバージョン:public static double parseDouble(final String input, final double defaultValue)

+0

私はデフォルト値のアイデアが好きです。私はそれをやろうと思っています。この例では、次のPMD違反を得るだけです。「メソッドには1つの出口点しかなくてはならず、メソッド内の最後の文でなければならない」。 – brimborium

+0

@brimborium:その警告は醜いセマンティックループを作ります:私は*両方の*警告を同時に避ける(単純な)解決策を見ません。 –

+0

ええ、私はルールセットから2番目のルールを蹴る傾向があります。私はそれがポイントだと理解していますが。出口点が1つだけであれば、複雑な方法の完全な意味を理解する方がはるかに簡単です。 – brimborium