java - String.valueOf(int) 中的 ArrayOutOfBoundsException 怎么可能发生?

标签 java jvm java-8 jvm-hotspot

为什么这段代码有时会产生 ArrayOutOfBoundsException? String.valueOf(int) 怎么可能?

public static String ipToString(ByteString bs) {
  if (bs == null || bs.isEmpty()) {
    return null;
  } else {
    StringBuilder sb = new StringBuilder();
    boolean started = false;
    for (Byte byt : bs) {
      if (started) {
        sb.append(".");
      }
      sb.append(String.valueOf(byt & 0xFF));
      started = true;
    }

    return sb.toString();
  }
}


java.lang.ArrayIndexOutOfBoundsException: -81914
  at java.lang.Integer.getChars(Integer.java:458)
  at java.lang.Integer.toString(Integer.java:402)
  at java.lang.String.valueOf(String.java:3086)
  at com.mystuff.mypackage.ipToString(MyCode.java:1325)
  ...
  at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
  at java.lang.Thread.run(Thread.java:745)

更新

我不知道发生这种情况时字节的值,但似乎对于任何可能的字节值都不应该。

一旦发生一次,每次调用都会出错并出现相同的异常。

环境:

java version "1.8.0_20"
Java(TM) SE Runtime Environment (build 1.8.0_20-b26)
Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)

最佳答案

这是 JDK 8u20 中引入的一个 JIT 编译器错误,是另一个修复的副作用:
JDK-8042786

问题与自动装箱消除优化有关。
解决方法是通过 -XX:-EliminateAutoBox JVM flag

关闭优化

看起来这个问题也存在于最新的 JDK 9 源代码库中。
我已提交错误报告:https://bugs.openjdk.java.net/browse/JDK-8058847包含 100% 可重现的最小测试用例。

关于java - String.valueOf(int) 中的 ArrayOutOfBoundsException 怎么可能发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25942010/

相关文章:

Java 8 : Pass object's method & its arguments as parameter

java - 以编程方式运行 TestNG 需要循环来自动创建多个测试

Java 8 : Chain Consumer<Y> to Function<X, Y>

java - 在 Java 中使用 DOM 通过 XSLT 转换 XML

java - Antlworks语法解析器

java - 如何为 JVM 崩溃日志文件指定唯一的名称?

java - 已接受 XX :UseSSE values for Java JVM?

java - 为什么过滤未排序的列表比过滤排序的列表更快

Java 线程在没有异常/可抛出的情况下停止

java - 在 Java 中从 MySQL 中检索记录