{"record":{"id":"fd3a983804ebc16b","repo":"apache/flink","slug":"cannot-register-null-class-or-serializer","errorCode":null,"errorMessage":"Cannot register null class or serializer.","messagePattern":"Cannot register null class or serializer\\.","errorType":"validation","errorClass":"NullPointerException","httpStatus":null,"severity":"error","filePath":"flink-core/src/main/java/org/apache/flink/api/common/serialization/SerializerConfigImpl.java","lineNumber":104,"sourceCode":"    @Internal\n    public SerializerConfigImpl(Configuration configuration) {\n        this.configuration = configuration;\n    }\n\n    /**\n     * Adds a new Kryo default serializer to the Runtime.\n     *\n     * <p>Note that the serializer instance must be serializable (as defined by\n     * java.io.Serializable), because it may be distributed to the worker nodes by java\n     * serialization.\n     *\n     * @param type The class of the types serialized with the given serializer.\n     * @param serializer The serializer to use.\n     */\n    public <T extends Serializer<?> & Serializable> void addDefaultKryoSerializer(\n            Class<?> type, T serializer) {\n        if (type == null || serializer == null) {\n            throw new NullPointerException(\"Cannot register null class or serializer.\");\n        }\n\n        defaultKryoSerializers.put(type, new SerializableSerializer<>(serializer));\n    }\n\n    /**\n     * Adds a new Kryo default serializer to the Runtime.\n     *\n     * @param type The class of the types serialized with the given serializer.\n     * @param serializerClass The class of the serializer to use.\n     */\n    public void addDefaultKryoSerializer(\n            Class<?> type, Class<? extends Serializer<?>> serializerClass) {\n        if (type == null || serializerClass == null) {\n            throw new NullPointerException(\"Cannot register null class or serializer.\");\n        }\n        defaultKryoSerializerClasses.put(type, serializerClass);\n    }","sourceCodeStart":86,"sourceCodeEnd":122,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-core/src/main/java/org/apache/flink/api/common/serialization/SerializerConfigImpl.java#L86-L122","documentation":"Thrown by addDefaultKryoSerializer(Class<?> type, T serializer) when either the type class or the serializer instance is null. Registering a Kryo default serializer requires both a non-null target class and a non-null serializer object; a null argument indicates a caller bug. This is a hard precondition enforced before any state mutation.","triggerScenarios":"Calling env.getConfig().addDefaultKryoSerializer(null, mySerializer) or addDefaultKryoSerializer(MyClass.class, null). Common when the type or serializer is looked up dynamically and the lookup returned null.","commonSituations":"Dynamic class loading where Class.forName returned null or threw silently; passing a serializer field that was never initialized; copy-paste errors wiring configuration.","solutions":["Check that the type Class<?> argument is non-null before calling the method.","Check that the serializer instance is non-null and properly instantiated.","If loading the class dynamically, guard against null and log a meaningful error before calling addDefaultKryoSerializer."],"exampleFix":"// before\nconfig.addDefaultKryoSerializer(loadedClass, null);\n\n// after\nif (loadedClass != null && serializer != null) {\n    config.addDefaultKryoSerializer(loadedClass, serializer);\n}","handlingStrategy":"validation","validationCode":"if (type == null || serializer == null) {\n    throw new IllegalArgumentException(\"type and serializer must both be non-null\");\n}\nconfig.addDefaultKryoSerializer(type, serializer);","typeGuard":"import java.util.Objects;\nObjects.requireNonNull(type, \"type\");\nObjects.requireNonNull(serializer, \"serializer\");","tryCatchPattern":null,"preventionTips":["Always null-check class and serializer before calling registration methods.","Validate configuration-derived class names are non-empty and resolvable before passing Class objects."],"tags":["serialization","kryo","null-check","configuration"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}