2011-06-28 78 views
4

FindBugs的告诉我,我有以下错误:自动装箱错误

A primitive is boxed, and then immediately unboxed. This probably is due to a manual boxing in a place where an unboxed value is required, thus forcing the compiler to immediately undo the work of the boxing.

下面是相关代码:

... 
String str= "10.0"; 
Double d = (str != null ? Double.valueOf(str) : new Double(0.0)); 
... 

这是什么意思?我该如何解决呢?

+3

您是否尝试将此行分割为多个,从而查看findbugs的哪一部分的确切含义? – ZeissS

回答

5

看起来像FindBugs中的一个bug给我。如果您编译该代码,然后在其上运行javap -c,则它永远不会调用通常用于拆箱的doubleValue()

诚然,你可能想使用缓存Double零,而不是每次就执行一次分配一个,但除此之外,它看起来合理,我...

我建议你将其报告给FindBugs的球队。

编辑:在向FindBugs团队报告此问题之前,我会用简短的​​完整程序更新您的问题,以显示问题。我向你表达了你向我们展示的代码是FindBugs所抱怨的代码。如果不是这样,所有投注都关闭:)

+0

我以为否则,但你是对的:因为条件中的两个表达式都是'Double'类型,整个条件表达式具有相同的时间:不需要取消装箱(和重新装箱)。如果第一个表达式中有'Double.parseDouble(str)',这将会不同。 –

+0

由于FindBugs分析字节码,也许这是一个编译器问题? – musiKk

+0

@muisKk:不,因为如果你看看我的答案,你会发现我也在字节码上运行了'javap',并且从来没有见过'doubleValue'用于拆箱。 –

3

我尝试了你的代码 - FindBugs不显示任何错误。我认为这个代码明显不同于那个会产生错误。

0

您不需要任何自动装箱或取消装箱。

double d = str == null ? 0.0 : Double.parseDouble(str); 

的核心是,当你想使用基本不使用对象。

恕我直言它使用正面表达而不是负面和双面负布尔表达式的混淆。