redis/jedis · error · IllegalArgumentException

DatabaseClientConfigs must not contain null elements

Error message

DatabaseClientConfigs must not contain null elements

What it means

After the null/empty check, MultiDbConfig's constructor iterates the array and rejects any null element with IllegalArgumentException("DatabaseClientConfigs must not contain null elements"), since a null slot cannot define a usable database.

Solutions

  1. Filter out null elements before constructing MultiDbConfig
  2. Use a List and toArray(new DatabaseConfig[0]) to avoid trailing/interior nulls from pre-sized arrays
  3. Validate each element is non-null when assembling the array

Example fix

// before
DatabaseConfig[] cfgs = new DatabaseConfig[3];
cfgs[0] = db1; cfgs[2] = db3; // cfgs[1] is null
MultiDbConfig config = new MultiDbConfig(cfgs); // IllegalArgumentException
// after
List<DatabaseConfig> list = new ArrayList<>();
list.add(db1); list.add(db3);
MultiDbConfig config = new MultiDbConfig(list.toArray(new DatabaseConfig[0]));
Defensive patterns

Strategy: validation

Validate before calling

for (DatabaseConfig c : databaseConfigs) {
  Objects.requireNonNull(c, "DatabaseClientConfigs must not contain null elements");
}

Type guard

boolean allNonNull(DatabaseConfig[] cfgs) {
  return Arrays.stream(cfgs).allMatch(Objects::nonNull);
}

Prevention

When it happens

Trigger: new MultiDbConfig(new DatabaseConfig[]{cfg1, null, cfg3}) — building the array by index or from a collection converted with toArray on a sized-but-partially-filled array, leaving null slots.

Common situations: Arrays pre-allocated with a fixed size but only partially populated; optional database configs filtered out but null placeholders left behind; deserializing config lists with missing entries.

Related errors


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

Appendix: source

Thrown at src/main/java/redis/clients/jedis/MultiDbConfig.java:683

   * Constructs a new MultiDbConfig with the specified database configurations.
   * <p>
   * This constructor validates that at least one database configuration is provided and that all
   * configurations are non-null. Use the {@link Builder} class for more convenient configuration
   * with default values.
   * </p>
   * @param databaseConfigs array of database configurations defining the available Redis endpoints
   * @throws JedisValidationException if databaseConfigs is null or empty
   * @throws IllegalArgumentException if any database configuration is null
   * @see Builder#Builder(DatabaseConfig[])
   */
  public MultiDbConfig(DatabaseConfig[] databaseConfigs) {

    if (databaseConfigs == null || databaseConfigs.length < 1) throw new JedisValidationException(
        "DatabaseClientConfigs are required for MultiDbConnectionProvider");

    for (DatabaseConfig databaseConfig : databaseConfigs) {
      if (databaseConfig == null)
        throw new IllegalArgumentException("DatabaseClientConfigs must not contain null elements");
    }
    this.databaseConfigs = databaseConfigs;
  }

  /**
   * Returns the array of database configurations defining available Redis endpoints.
   * @return array of database configurations, never null or empty
   */
  public DatabaseConfig[] getDatabaseConfigs() {
    return databaseConfigs;
  }

  /**
   * Returns the encapsulated retry configuration for command execution.
   * <p>
   * This provides access to all retry-related settings through a single configuration object.
   * </p>
   * @return retry configuration, never null

View on GitHub (pinned to 6dac31d4c2)