{"record":{"id":"b4b20a583c03092a","repo":"apache/flink","slug":"name-aggregator-or-convergence-criterion-must-no","errorCode":null,"errorMessage":"Name, aggregator, or convergence criterion must not be null","messagePattern":"Name, aggregator, or convergence criterion must not be null","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"flink-core/src/main/java/org/apache/flink/api/common/aggregators/AggregatorRegistry.java","lineNumber":66,"sourceCode":"        this.registry.put(name, aggregator);\n    }\n\n    public Collection<AggregatorWithName<?>> getAllRegisteredAggregators() {\n        ArrayList<AggregatorWithName<?>> list =\n                new ArrayList<AggregatorWithName<?>>(this.registry.size());\n\n        for (Map.Entry<String, Aggregator<?>> entry : this.registry.entrySet()) {\n            @SuppressWarnings(\"unchecked\")\n            Aggregator<Value> valAgg = (Aggregator<Value>) entry.getValue();\n            list.add(new AggregatorWithName<>(entry.getKey(), valAgg));\n        }\n        return list;\n    }\n\n    public <T extends Value> void registerAggregationConvergenceCriterion(\n            String name, Aggregator<T> aggregator, ConvergenceCriterion<T> convergenceCheck) {\n        if (name == null || aggregator == null || convergenceCheck == null) {\n            throw new IllegalArgumentException(\n                    \"Name, aggregator, or convergence criterion must not be null\");\n        }\n\n        Aggregator<?> genAgg = aggregator;\n\n        Aggregator<?> previous = this.registry.get(name);\n        if (previous != null && previous != genAgg) {\n            throw new RuntimeException(\"An aggregator is already registered under the given name.\");\n        }\n\n        this.registry.put(name, genAgg);\n        this.convergenceCriterion = convergenceCheck;\n        this.convergenceCriterionAggregatorName = name;\n    }\n\n    public String getConvergenceCriterionAggregatorName() {\n        return this.convergenceCriterionAggregatorName;\n    }","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-core/src/main/java/org/apache/flink/api/common/aggregators/AggregatorRegistry.java#L48-L84","documentation":"Thrown by AggregatorRegistry.registerAggregationConvergenceCriterion when name, aggregator, or convergenceCheck is null. Delta iterations require a named aggregator plus a ConvergenceCriterion that decides when iteration stops; all three are mandatory. A null convergence criterion would leave the iteration with no termination logic, and a null name/aggregator would break aggregation.","triggerScenarios":"Calling registerAggregationConvergenceCriterion(null, agg, criterion) or omitting the criterion (null); building the criterion from config that returned null.","commonSituations":"Custom delta-iteration jobs; tests wiring convergence by hand; aggregator class or criterion class loaded dynamically that failed to instantiate.","solutions":["Validate all three arguments non-null before calling; build the criterion from a validated factory.","If loading classes from config, instantiate and null-check each before registration."],"exampleFix":"// before\nregistry.registerAggregationConvergenceCriterion(name, agg, null);\n// after\nObjects.requireNonNull(name, \"name\");\nObjects.requireNonNull(aggregator, \"aggregator\");\nObjects.requireNonNull(convergenceCheck, \"convergence criterion\");\nregistry.registerAggregationConvergenceCriterion(name, aggregator, convergenceCheck);","handlingStrategy":"validation","validationCode":"Objects.requireNonNull(name, \"name\");\nObjects.requireNonNull(aggregator, \"aggregator\");\nObjects.requireNonNull(convergenceCheck, \"criterion\");\nregistry.registerAggregationConvergenceCriterion(name, aggregator, convergenceCheck);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Build the ConvergenceCriterion from a validated factory.","Null-check all three arguments at the source.","Centralize convergence setup."],"tags":["aggregator","iteration","convergence","null-check"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}