PMD:DD / DUexception

我正在使用带有PMD Plug-in (4.0.0.v20130510-1000) 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答案中,它说这些exception与分配从未读过的值有关。 但是我在这种情况下得到了违规行为:

 // 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块中,DDexception消失了,但我在两个任务中得到了一个DUexception。

现在我的问题是:我该如何处理? 什么是PMD的首选解决方案? 这个规则究竟试图阻止什么(即为什么这是不好的做法)?

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

您可以通过将解析提取到单独的方法中来解决此问题(并更清楚地区分问题):

 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)