一尘不染

ArrayOutOfBoundsException如何在String.valueOf(int)中出现?

java

为什么这段代码有时会产生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)

阅读 236

收藏
2020-12-03

共1个答案

一尘不染

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

该问题与自动装箱消除优化有关。
解决方法是通过-XX:-EliminateAutoBoxJVM标志关闭优化

在最新的JDK 9源库中似乎也存在该问题。
我已经提交了错误报告:https :
//bugs.openjdk.java.net/browse/JDK-8058847,其中包含100%可重复的最小测试用例。

2020-12-03