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
- Check the key for null before calling getSlot and handle/skip the operation
- Fix the upstream code that produced a null key (missing field, failed lookup)
- 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
- Null-check keys before cluster routing
- Validate required key fields at deserialization time
- Prefer Objects.requireNonNull with a clear message at API boundaries
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
- setHostAndPort method has limited capability.
- Must not instantiate this class
- DriverInfo must not be null
- protocol must not be null
- ${status}
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)