为什么parseInt警告使用valueOf

时间:2017-06-19 17:40:15

标签: java

在查看VisibilityFilter(java 8,1.8.0_131)的源代码时,我发现了以下注释块:

Integer.parseInt(String s, int radix)

虽然我理解有关IntegerCache的第一部分,但我不明白为什么会出现/* * WARNING: This method may be invoked early during VM initialization * before IntegerCache is initialized. Care must be taken to not use * the valueOf method. */ 的警告,以及为什么会出现这种情况。

我发现valueOf依赖于valueOf(),但我仍然不明白为什么会出现此警告。

有人可以解释一下该评论的确切含义(以及不应该使用valueOf的背景),以及可能出现的问题。

编辑:

Integer.valueOf(int i)中的代码似乎已经改变,因为下面的评论中的其他问题被提出,现在是

parseInt()

并且应该从之前的断言错误中保存。

2 个答案:

答案 0 :(得分:55)

  

有人可以解释一下该评论的确切含义(以及不应该使用valueOf的背景),以及可能出现的问题。

Integer类创建并维护表示小整数值的Integer个对象的缓存;默认情况下,涵盖-128到127范围内的值(更多讨论herehere和许多其他地方)。当Integer.valueOf()的参数表示范围中的数字时,parseInt()将从此缓存返回一个对象。该评论警告valueOf()不得依赖null,因为在填充该缓存之前可能会调用前者。

在这种情况下可能出现的错误行为未被指定,并且可以想象在Java版本之间可能会有所不同,但可能的可能性是NullPointerException将被返回或异常(IndexOutOfBoundsException,{{1将被抛出。

在任何情况下,这都是实现中的内部注释,而不是对类Integer的用户的注释。当任何用户代码运行时,必要的缓存初始化完成,Integer.valueOf()可以依赖于its API documentation所描述的完全行为。

答案 1 :(得分:36)

源代码(几乎)仅供参考,javadoc不包含该警告,因为它仅适用于Java本身的开发人员。

这可能是一个警告,因为有人使用valueOf方法对parseInt方法进行编码而导致某些问题或错误,该方法可以在初始化内部缓存之前调用。

换句话说,假设您没有更改Integer类,那么警告不适合您!