Ошибка деления на ноль от Colt OpenLongObjectHashMap - PullRequest
0 голосов
/ 28 января 2019

Я видел это исключение из 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 - внутренний массив.

Однако таблица всегда инициализируется только в массив с минимальным размером 3 (и по умолчаниюэто 277, что я использую).Целочисленное обертывание также не представляется возможным.

Так что это может показаться невозможной ошибкой.

Есть идеи?

1 Ответ

0 голосов
/ 27 июня 2019

Это оказалось ошибкой оптимизации компилятора Java в используемом компиляторе JITK IBM JDK.

См. Этот отчет об ошибке: IJ06000: НЕОЖИДАННОЕ РАЗДЕЛЕНИЕ ПО НУЛЕМУ, ИСКЛЮЧЕНИЕ

Рекомендуемое исправление - отключить оптимизацию LoopVersioner для проблемных методов.

...