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
- Filter out null elements before constructing MultiDbConfig
- Use a List and toArray(new DatabaseConfig[0]) to avoid trailing/interior nulls from pre-sized arrays
- 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
- Build arrays from collections with toArray(new DatabaseConfig[0]) rather than pre-sized arrays
- Filter nulls (stream.filter(Objects::nonNull)) when configs are optional
- Add a defensive null-element check in your config assembly code
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
- DatabaseClientConfigs are required for…
- Endpoint does not exist.
- It is not allowed to create Transaction from this
- Initialization failed due to initialization policy
- Initialization failed due to initialization policy
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 nullView on GitHub (pinned to 6dac31d4c2)