盒装值未装箱然后重新装箱

时间:2015-08-17 04:46:30

标签: java findbugs boxing unboxing

FindBugs给出了关于以下行的警告,其中invoiceNumberInteger对象:

text.append(String.format("%010d-", (invoiceNumber == null) ? 0 : invoiceNumber));

警告是:"盒装值未装箱,然后立即重新装箱"

现在我觉得我理解(联合国)拳击比赛,但我不知道如何在没有得到警告的情况下做同样的事情?

我发现我可以使用以下代码取消警告,但这看起来更啰嗦:

int invNo = (invoiceNumber == null) ? 0 : invoiceNumber;
text.append(String.format("%010d-", invNo));

有人能告诉我什么是正确的'如何做到这一点?

顺便说一句,我已经查看了相关的问题,我了解他们发生了什么,但这似乎与其中任何一个都没有匹配。

2 个答案:

答案 0 :(得分:22)

(invoiceNumber == null) ? 0 : invoiceNumber)表达式的类型是 int。如果invoiceNumber不是invoiceNumber,则需要取消装箱null

另一方面,String.format需要一个String参数后跟Object引用,这意味着您的int会立即重新加入Integer

您可以尝试使用(invoiceNumber == null) ? Integer.valueOf(0) : invoiceNumber)来避免原始拆箱,这会使此表达式返回Integer

答案 1 :(得分:1)

尝试将(invoiceNumber == null) ? 0 : invoiceNumber更改为(invoiceNumber == null) ? 0 : invoiceNumber.intValue()。我认为警告来自你在" false"中再次使用Integer。 case,而不是int