我在Colt OpenLongObjectHashMap上看到了这个例外
java.lang.ArithmeticException: divide by zero
at cern.colt.map.OpenLongObjectHashMap.indexOfKey(Unknown Source)
at cern.colt.map.OpenLongObjectHashMap.get(Unknown Source)它是不可复制的。
这是indexOfKey:
protected int indexOfKey(long key) {
final long tab[] = table;
final byte stat[] = state;
final int length = tab.length;
final int hash = HashFunctions.hash(key) & 0x7FFFFFFF;
int i = hash % length;
int decrement = hash % (length-2); // double hashing, see http://www.eece.unm.edu/faculty/heileman/hash/node4.html
//int decrement = (hash / length) % length;
if (decrement == 0) decrement = 1;
// stop if we find a free slot, or if we find the key itself.
// do skip over removed slots (yes, open addressing is like that...)
while (stat[i] != FREE && (stat[i] == REMOVED || tab[i] != key)) {
i -= decrement;
//hashCollisions++;
if (i<0) i+=length;
}
if (stat[i] == FREE) return -1; // not found
return i; //found, return index where key is contained
}因此,唯一使用的除数是length和(length - 2),其中length是table.length,table是内部数组。
然而,table只被初始化为一个最小大小为3的数组(默认值是277,这就是我使用的)。整数环绕似乎也是不可能的。
所以这似乎是一个不可能的错误。
有什么想法吗?
发布于 2019-06-27 18:24:42
这被证明是正在使用的IBM JDK JIT编译器中的Java编译器优化错误。
请参阅此错误报告:IJ06000: UNEXPECTED DIVIDE BY ZERO EXCEPTION
建议的修复方法是禁用问题方法上的LoopVersioner优化。
https://stackoverflow.com/questions/54400267
复制相似问题