为什么这段代码有时会产生ArrayOutOfBoundsException?那怎么可能String.valueOf(int)呢?
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:-EliminateAutoBoxJVM标志关闭优化
-XX:-EliminateAutoBox
在最新的JDK 9源库中似乎也存在该问题。 我已经提交了错误报告:https : //bugs.openjdk.java.net/browse/JDK-8058847,其中包含100%可重复的最小测试用例。