PMD:DD / DU异常

时间:2013-05-23 15:52:53

标签: java pmd

我正在使用带有PMD Plug-in (4.0.0.v20130510-1000)的Eclipse,并且会遇到很多违规行为:

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

this 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的首选解决方案?这个规则究竟试图阻止什么(即为什么这是不好的做法)?

2 个答案:

答案 0 :(得分:19)

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中没有对freq进行parseDouble赋值。 在一个例外情况下,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的回答,使用不会引发异常的双重转换。记录将表明优先于上述样式的严重程度。在出错时记录一个简单的转换函数可能不是很好的样式:记录太多,忽略日志记录(?),难以修复。

答案 1 :(得分: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;
  }
}

如果您有不同的默认值,您还可以添加两个参数版本:public static double parseDouble(final String input, final double defaultValue)