【问题标题】:Why does parseInt warn of using valueOf为什么 parseInt 警告使用 valueOf
【发布时间】:2026-01-07 14:50:01
【问题描述】:

在查看Integer.parseInt(String s, int radix)(java 8, 1.8.0_131)的源代码时,我发现了以下注释块:

/*
* WARNING: This method may be invoked early during VM initialization
* before IntegerCache is initialized. Care must be taken to not use
* the valueOf method.
*/

虽然我了解有关 IntegerCache 的第一部分,但我不明白为什么会有关于 valueOf 的警告,以及为什么在这种情况下。

我看到valueOf() 依赖于parseInt(),但我仍然不明白为什么会有这个警告。

谁能解释一下评论警告我的确切内容(以及不应使用 valueOf 的上下文),以及可能出错的地方。

编辑:

Integer.valueOf(int i) 中的代码似乎已经改变,因为下面评论中的另一个问题被问到了,现在是

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

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

【问题讨论】:

标签: java


【解决方案1】:

谁能解释一下评论警告我的确切内容(以及不应使用 valueOf 的上下文),以及可能出错的地方。

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

没有指定在这种情况下可能出现的不当行为,并且可以想象在 Java 版本之间可能会有所不同,但可能会返回 null 或异常(NullPointerExceptionIndexOutOfBoundsException、... ) 会被抛出。

无论如何,这是实现中的内部注释,而不是对Integer 类用户的注释。当任何用户代码运行时,必要的缓存初始化已经完成,可以依赖Integer.valueOf() 完全按照its API documentation 描述的方式运行。

【讨论】:

    【解决方案2】:

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

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

    换句话说,假设您没有更改 Integer 类,则该警告不是针对您的!

    【讨论】:

    • 谢谢,顺便说一句好问题 - 不知道那个警告
    • 如果你是 Integer 的子类,这绝对是你需要知道的。
    • @IsaacRabinovitch 子类化Integer 应该是不可能的(没有作弊),因为Integer 类被声明为final