Java 自动装箱错误

Java 自动装箱错误,java,findbugs,Java,Findbugs,FindBugs告诉我有以下错误: 对基本体进行装箱,然后立即取消装箱。这可能是由于在需要未绑定值的位置手动装箱,从而迫使编译器立即撤消装箱工作 以下是相关代码: ... String str= "10.0"; Double d = (str != null ? Double.valueOf(str) : new Double(0.0)); ... 这意味着什么?我该如何修复它?在我看来,这就像FindBugs中的一个bug。如果您编译该代码,然后在其上运行javap-c,它就不会调用doub

FindBugs告诉我有以下错误:

对基本体进行装箱,然后立即取消装箱。这可能是由于在需要未绑定值的位置手动装箱,从而迫使编译器立即撤消装箱工作

以下是相关代码:

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

这意味着什么?我该如何修复它?

在我看来,这就像FindBugs中的一个bug。如果您编译该代码,然后在其上运行
javap-c
,它就不会调用
doubleValue()
,这通常是用于取消装箱的

double d = str == null ? 0.0 : Double.parseDouble(str);
诚然,您可能希望使用缓存的
Double
来表示零,而不是每次执行时都分配一个,但除此之外,我认为这是合理的

我建议你向FindBugs团队报告


编辑:在将此报告给FindBugs团队之前,我会用一个简短但完整的程序更新您的问题,该程序演示了问题。我相信你的话,你给我们看的代码就是Bugs抱怨的代码。如果不是这样的话,所有的赌注都是无效的:)

我尝试了你的代码-FindBugs不会显示任何错误。我认为这段代码与产生错误的代码截然不同。

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

double d = str == null ? 0.0 : Double.parseDouble(str);
寓意是,当你想使用原语时,不要使用对象


我认为使用正表达式而不是负布尔表达式和双负布尔表达式比较容易混淆。

您是否尝试过将这一行拆分为多个,从而了解findbugs的确切含义?我不这么认为,但您是对的:因为条件表达式中的两个表达式都是类型
double
,整个条件表达式具有相同的时间:不需要取消装箱(和重新装箱)。如果第一个表达式中的
Double.parseDouble(str)
,这将是不同的。因为FindBugs分析字节码,这可能是编译器的问题?@muisKk:不,因为如果你看我的答案,你会看到我也在字节码上运行了
javap
,而且从未见过用于取消装箱的
doubleValue
。但是你不知道OP使用了哪种编译器…?@MusiKk:没错。这将是一个相当奇怪的编译器错误,虽然。。。我认为更有可能的是OP没有发布导致FindBugs问题的代码。