21

我正在使用 EclipsePMD 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 分配。在异常情况下,频率仍然为 0。也许可以标记。 因此,当分配给捕获内的频率时,它就消失了。

当在 catch (2) 中赋值给 freq 时,初始赋值 (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;
  }
}

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

于 2013-05-27T08:08:52.087 回答