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

Dun*_*ear 14 java boxing unboxing findbugs

FindBugs给我一个关于以下行的警告,其中invoiceNumber是一个Integer对象:

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

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

现在我觉得我理解(联合国)拳击,但我看不出你怎么会在没有得到警告的情况下做同样的事情?

我发现我可以使用以下代码来消除警告,但这似乎更加冗长:

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

有人能告诉我上面做的"正确"方法是什么吗?

顺便说一下,我已经看了相关的问题,我理解他们发生了什么,但这似乎与其中任何一个都不匹配.

Era*_*ran 24

(invoiceNumber == null) ? 0 : invoiceNumber)表达式的类型是 int.它要求拆箱invoiceNumber的情况invoiceNumber不是null.

另一方面,String.format期望一个String参数后跟Object引用,这意味着你的intget会立即Integer再次装箱.

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

  • @DuncanKinnear我假设您的两行"解决方案"仅阻止FindBugs检测到拆箱和重新装箱,因此与原始代码相比,它实际上不会改变任何内容. (8认同)