redis/jedis · error · NullPointerException

Slot calculation of null is impossible

Error message

Slot calculation of null is impossible

What it means

JedisClusterCRC16.getSlot(String) computes the Redis Cluster slot (CRC16 mod 16384) for a key and explicitly throws a NullPointerException with this message when the key is null, since a null key has no slot. The custom message makes the cause clearer than a bare NPE deeper in hash-tag parsing.

Solutions

  1. Check the key for null before calling getSlot and handle/skip the operation
  2. Fix the upstream code that produced a null key (missing field, failed lookup)
  3. For cluster commands, always supply a valid non-null key so routing can compute the slot

Example fix

// before
int slot = JedisClusterCRC16.getSlot(key);
// after
if (key == null) throw new IllegalArgumentException("key must not be null");
int slot = JedisClusterCRC16.getSlot(key);
Defensive patterns

Strategy: validation

Validate before calling

if (key == null) throw new IllegalArgumentException("key must not be null");
int slot = JedisClusterCRC16.getSlot(key);

Type guard

boolean hasKey(String key) { return key != null && !key.isEmpty(); }

Try / catch

try {
  int slot = JedisClusterCRC16.getSlot(key);
} catch (NullPointerException e) {
  // handle missing key: log, skip, or substitute a default key
}

Prevention

When it happens

Trigger: Calling JedisClusterCRC16.getSlot((String) null), typically via cluster routing of a command whose key argument is null — e.g. passing a null key to a cluster-mode command or building a CommandObject with a null key.

Common situations: Variables that failed to be assigned (e.g. a lookup returned null); deserialized records with missing keys; calling low-level routing APIs directly in custom sharding code.

Related errors


AI-assisted analysis of redis/jedis@6dac31d4c2 (2026-09-08). Data as JSON: /api/errors/96908e08a4cf6747. Report an issue: GitHub.

Appendix: source

Thrown at src/main/java/redis/clients/jedis/util/JedisClusterCRC16.java:37

      0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE,
      0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4,
      0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59,
      0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1,
      0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D,
      0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,
      0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0,
      0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E,
      0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C,
      0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827,
      0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB,
      0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F,
      0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2,
      0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,
      0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, };

  public static int getSlot(String key) {
    if (key == null) {
      throw new NullPointerException("Slot calculation of null is impossible");
    }

    key = JedisClusterHashTag.getHashTag(key);
    // optimization with modulo operator with power of 2 equivalent to getCRC16(key) % 16384
    return getCRC16(key) & (16384 - 1);
  }

  public static int getSlot(byte[] key) {
    if (key == null) {
      throw new NullPointerException("Slot calculation of null is impossible");
    }

    int s = -1;
    int e = -1;
    boolean sFound = false;
    for (int i = 0; i < key.length; i++) {
      if (key[i] == '{' && !sFound) {
        s = i;

View on GitHub (pinned to 6dac31d4c2)