{"record":{"id":"3601036ce00a810a","repo":"apache/kafka","slug":"invalid-empty-members-has-been-provided","errorCode":null,"errorMessage":"Invalid empty members has been provided","messagePattern":"Invalid empty members has been provided","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"clients/src/main/java/org/apache/kafka/clients/admin/RemoveMembersFromConsumerGroupOptions.java","lineNumber":39,"sourceCode":"\nimport java.util.Collection;\nimport java.util.Collections;\nimport java.util.HashSet;\nimport java.util.Set;\n\n/**\n * Options for {@link AdminClient#removeMembersFromConsumerGroup(String, RemoveMembersFromConsumerGroupOptions)}.\n * It carries the members to be removed from the consumer group.\n */\n@InterfaceAudience.Public\npublic class RemoveMembersFromConsumerGroupOptions extends AbstractOptions<RemoveMembersFromConsumerGroupOptions> {\n\n    private final Set<MemberToRemove> members;\n    private String reason;\n\n    public RemoveMembersFromConsumerGroupOptions(Collection<MemberToRemove> members) {\n        if (members.isEmpty()) {\n            throw new IllegalArgumentException(\"Invalid empty members has been provided\");\n        }\n        this.members = new HashSet<>(members);\n    }\n\n    public RemoveMembersFromConsumerGroupOptions() {\n        this.members = Collections.emptySet();\n    }\n\n    /**\n     * Sets an optional reason.\n     */\n    public void reason(final String reason) {\n        this.reason = reason;\n    }\n\n    public Set<MemberToRemove> members() {\n        return members;\n    }","sourceCodeStart":21,"sourceCodeEnd":57,"githubUrl":"https://github.com/apache/kafka/blob/996fb4585aa1bcc8980b0e1b8d6b168b986cd979/clients/src/main/java/org/apache/kafka/clients/admin/RemoveMembersFromConsumerGroupOptions.java#L21-L57","documentation":"Thrown by the RemoveMembersFromConsumerGroupOptions(Collection<MemberToRemove>) constructor when the supplied collection is empty. The static-consumer-group-membership removal API requires at least one explicit member; removing zero members is a no-op and the client rejects it rather than issuing a meaningless RPC. Use the no-arg constructor for the 'removeAll' mode instead.","triggerScenarios":"Calling `new RemoveMembersFromConsumerGroupOptions(emptyList())`; passing a filtered member set that ended up empty after excluding already-removed members.","commonSituations":"Building a removal list from admin.describeConsumerGroup output where all members were already filtered out; UI that lets a user deselect every member before clicking remove; reusing the same collection across retries after it was cleared.","solutions":["If you intend to remove all members, use the no-arg constructor: `new RemoveMembersFromConsumerGroupOptions()`.","Otherwise ensure the collection is non-empty: skip the call or report 'nothing to remove' to the user.","Inspect the collection size before construction and log/handle the empty case."],"exampleFix":"// before\nRemoveMembersFromConsumerGroupOptions opts =\n    new RemoveMembersFromConsumerGroupOptions(members);\n\n// after\nRemoveMembersFromConsumerGroupOptions opts = members.isEmpty()\n    ? new RemoveMembersFromConsumerGroupOptions()\n    : new RemoveMembersFromConsumerGroupOptions(members);","handlingStrategy":"validation","validationCode":"RemoveMembersFromConsumerGroupOptions opts = members.isEmpty()\n    ? new RemoveMembersFromConsumerGroupOptions()  // removeAll\n    : new RemoveMembersFromConsumerGroupOptions(members);","typeGuard":"static boolean isRemovableMembers(Collection<MemberToRemove> c) {\n    return c != null; // empty is acceptable ONLY when removeAll is intended\n}","tryCatchPattern":"try {\n    opts = new RemoveMembersFromConsumerGroupOptions(members);\n} catch (IllegalArgumentException e) {\n    if (members.isEmpty()) {\n        opts = new RemoveMembersFromConsumerGroupOptions(); // fall back to removeAll\n    } else throw e;\n}","preventionTips":["Decide upfront whether targeted removal or removeAll is intended and construct the matching options.","Surface a 'no members selected' UX message instead of constructing options with an empty collection.","Reuse the same member collection for options and result handling to avoid drift."],"tags":["admin-client","consumer-group","validation","illegal-argument","static-membership"],"backgroundTag":null,"analyzedSha":"996fb4585aa1bcc8980b0e1b8d6b168b986cd979","analyzedAt":"2026-08-11T22:03:28.655Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}