{"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/c31c9215e131f8c17e79f8901b48c13ee6aa8e7a/clients/src/main/java/org/apache/kafka/clients/admin/RemoveMembersFromConsumerGroupOptions.java#L21-L57","documentation":"Thrown by the RemoveMembersFromConsumerGroupOptions(Collection) constructor when the supplied collection of members is empty. Removing zero specific members is ambiguous with removeAll mode (the no-arg constructor), so the explicit-collection constructor rejects an empty set to force the caller to choose.","triggerScenarios":"Constructing new RemoveMembersFromConsumerGroupOptions(Collections.emptyList()) or passing an empty list/set/Collection<MemberToRemove>. Contrast with the no-arg constructor which intentionally sets an empty set to signal 'remove all members'.","commonSituations":"Building the member list dynamically from a query (e.g. describing a group) that returned no members; filtering a member set down to zero at runtime; confusing 'remove these members' with 'remove all members' and passing an empty list to mean all.","solutions":["To remove all members of the group, use the no-arg constructor new RemoveMembersFromConsumerGroupOptions()","Ensure the collection passed to the constructor contains at least one MemberToRemove","Guard the construction: if the computed set is empty, either switch to removeAll or skip the call"],"exampleFix":"// before\nadmin.removeMembersFromConsumerGroup(groupId,\n    new RemoveMembersFromConsumerGroupOptions(List.of())); // throws\n\n// after - remove specific members\nnew RemoveMembersFromConsumerGroupOptions(\n    List.of(new MemberToRemove(memberIdentity)));\n// after - remove all members\nnew RemoveMembersFromConsumerGroupOptions();","handlingStrategy":"validation","validationCode":"Collection<MemberToRemove> members = ...;\nif (members == null || members.isEmpty()) {\n    // If you truly want to remove ALL members, use the no-arg constructor\n    // (removeAll mode). Otherwise this is a caller bug.\n    throw new IllegalArgumentException(\n        \"members must be non-empty; use new RemoveMembersFromConsumerGroupOptions() for removeAll\");\n}\nnew RemoveMembersFromConsumerGroupOptions(members);","typeGuard":"static boolean isNonEmptyMembers(Collection<MemberToRemove> members) {\n    return members != null && !members.isEmpty();\n}","tryCatchPattern":"try {\n    options = new RemoveMembersFromConsumerGroupOptions(members);\n} catch (IllegalArgumentException e) {\n    // Empty members supplied. Decide intent: removeAll or caller error.\n    if (intendedRemoveAll) {\n        options = new RemoveMembersFromConsumerGroupOptions(); // removeAll mode\n    } else {\n        throw e;\n    }\n}","preventionTips":["Distinguish 'remove specific members' from 'remove all' explicitly in your calling code; the no-arg constructor means removeAll.","Validate the members collection upstream (e.g. filter out members that are not currently in the group).","Never pass an empty collection to signal 'remove all' - the API uses the no-arg constructor for that."],"tags":["kafka","admin-client","consumer-group","group-removal","invalid-argument"],"analyzedSha":"c31c9215e131f8c17e79f8901b48c13ee6aa8e7a","analyzedAt":"2026-08-03T12:34:05.770Z","schemaVersion":2}