在查看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()
并且应该从之前的断言错误中保存。
答案 0 :(得分:55)
有人可以解释一下该评论的确切含义(以及不应该使用valueOf的背景),以及可能出现的问题。
Integer
类创建并维护表示小整数值的Integer
个对象的缓存;默认情况下,涵盖-128到127范围内的值(更多讨论here,here和许多其他地方)。当Integer.valueOf()
的参数表示范围中的数字时,parseInt()
将从此缓存返回一个对象。该评论警告valueOf()
不得依赖null
,因为在填充该缓存之前可能会调用前者。
在这种情况下可能出现的错误行为未被指定,并且可以想象在Java版本之间可能会有所不同,但可能的可能性是NullPointerException
将被返回或异常(IndexOutOfBoundsException
,{{1将被抛出。
在任何情况下,这都是实现中的内部注释,而不是对类Integer
的用户的注释。当任何用户代码运行时,必要的缓存初始化完成,Integer.valueOf()
可以依赖于its API documentation所描述的完全行为。
答案 1 :(得分:36)
源代码(几乎)仅供参考,javadoc不包含该警告,因为它仅适用于Java本身的开发人员。
这可能是一个警告,因为有人使用valueOf
方法对parseInt
方法进行编码而导致某些问题或错误,该方法可以在初始化内部缓存之前调用。
换句话说,假设您没有更改Integer类,那么警告不适合您!