{"record":{"id":"96908e08a4cf6747","repo":"redis/jedis","slug":"slot-calculation-of-null-is-impossible","errorCode":null,"errorMessage":"Slot calculation of null is impossible","messagePattern":"Slot calculation of null is impossible","errorType":"validation","errorClass":"NullPointerException","httpStatus":null,"severity":"error","filePath":"src/main/java/redis/clients/jedis/util/JedisClusterCRC16.java","lineNumber":37,"sourceCode":"      0xBB3B, 0xAB1A, 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, 0xEDAE,\n      0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4,\n      0x3E13, 0x2E32, 0x1E51, 0x0E70, 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59,\n      0x8F78, 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, 0x1080, 0x00A1,\n      0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D,\n      0xD31C, 0xE37F, 0xF35E, 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256,\n      0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, 0x34E2, 0x24C3, 0x14A0,\n      0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E,\n      0xC71D, 0xD73C, 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, 0xD94C,\n      0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, 0x5844, 0x4865, 0x7806, 0x6827,\n      0x18C0, 0x08E1, 0x3882, 0x28A3, 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB,\n      0xBB9A, 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, 0xFD2E, 0xED0F,\n      0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2,\n      0x2C83, 0x1CE0, 0x0CC1, 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8,\n      0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0, };\n\n  public static int getSlot(String key) {\n    if (key == null) {\n      throw new NullPointerException(\"Slot calculation of null is impossible\");\n    }\n\n    key = JedisClusterHashTag.getHashTag(key);\n    // optimization with modulo operator with power of 2 equivalent to getCRC16(key) % 16384\n    return getCRC16(key) & (16384 - 1);\n  }\n\n  public static int getSlot(byte[] key) {\n    if (key == null) {\n      throw new NullPointerException(\"Slot calculation of null is impossible\");\n    }\n\n    int s = -1;\n    int e = -1;\n    boolean sFound = false;\n    for (int i = 0; i < key.length; i++) {\n      if (key[i] == '{' && !sFound) {\n        s = i;","sourceCodeStart":19,"sourceCodeEnd":55,"githubUrl":"https://github.com/redis/jedis/blob/6dac31d4c224fb3257c216f3985340c6f500cdcb/src/main/java/redis/clients/jedis/util/JedisClusterCRC16.java#L19-L55","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","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"],"exampleFix":"// before\nint slot = JedisClusterCRC16.getSlot(key);\n// after\nif (key == null) throw new IllegalArgumentException(\"key must not be null\");\nint slot = JedisClusterCRC16.getSlot(key);","handlingStrategy":"validation","validationCode":"if (key == null) throw new IllegalArgumentException(\"key must not be null\");\nint slot = JedisClusterCRC16.getSlot(key);","typeGuard":"boolean hasKey(String key) { return key != null && !key.isEmpty(); }","tryCatchPattern":"try {\n  int slot = JedisClusterCRC16.getSlot(key);\n} catch (NullPointerException e) {\n  // handle missing key: log, skip, or substitute a default key\n}","preventionTips":["Null-check keys before cluster routing","Validate required key fields at deserialization time","Prefer Objects.requireNonNull with a clear message at API boundaries"],"tags":["java","null-pointer","cluster","key"],"backgroundTag":"null-argument","analyzedSha":"6dac31d4c224fb3257c216f3985340c6f500cdcb","analyzedAt":"2026-09-08T04:55:01.204Z","contentChangedAt":"2026-09-08T04:55:01.204Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}