使用 Integer.valueOf(String) 的“装箱/取消装箱以解析基元”的 Findbugs 问题

2022-09-01 02:27:20

我有这段代码:

public void someMethod(String id) {
   someOtherMethod(Integer.valueOf(id));
}

public void someOtherMethod(int id) {
   // do something with id
}

在第二行上,Findbugs抛出了这个异常:

装箱/取消装箱以解析基元

为什么Findbugs抱怨这一点,而我只是简单地调用Integer.valueOf()/我该如何解决这个问题?


答案 1

问题是 Integer.valueOf 返回一个 ,而不是一个 ,但你期望一个 .Findbugs基本上是在警告你,你正在以一种冗长的方式做到这一点,这涉及可能创建一个你不需要的对象(),然后你通过传递给它立即将其拆箱,例如:IntegerintsomeOtherMethodintIntegersomeOtherMethod(int)

String => int => Integer => int
          ^^^^^^^^^^^^^^
                \--- This is inside Integer.valueOf

相反,您可以并且可能应该避免不必要的往返,只需执行以下操作:Integer

String => int
^^^^^^^^^^^^^
      \--- Integer.parseInt

只是不需要临时和潜在的内存分配以及围绕它之类的内存。Integer

如果期望一个 ,你不会得到警告,因为这不是纯粹的临时。someOtherMethodIntegerInteger

这只是Findbugs和类似工具指出的一类不必要的拳击转换之一。


答案 2

我花了一段时间才弄清楚(部分原因是Jenkins刚刚说“Boxing/unboxing来解析一个原语”),但显然问题/解决方案在于Integer.valueOf()内部所做的,即:

Integer.valueOf(parseInt(s, 10));

因此,解决方案是直接调用 parseInt() 代替:

someOtherMethod(Integer.parseInt(id));

问题的详细说明(DM_BOXED_PRIMITIVE_FOR_PARSING)可以在findbugs页面上找到。


推荐