{"record":{"id":"bbf061f4c1a570ac","repo":"mybatis/mybatis-3","slug":"null-is-not-a-valid-language-driver","errorCode":null,"errorMessage":"null is not a valid Language Driver","messagePattern":"null is not a valid Language Driver","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"src/main/java/org/apache/ibatis/scripting/LanguageDriverRegistry.java","lineNumber":32,"sourceCode":" *    limitations under the License.\n */\npackage org.apache.ibatis.scripting;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\n/**\n * @author Frank D. Martinez [mnesarco]\n */\npublic class LanguageDriverRegistry {\n\n  private final Map<Class<? extends LanguageDriver>, LanguageDriver> languageDriverMap = new HashMap<>();\n\n  private Class<? extends LanguageDriver> defaultDriverClass;\n\n  public void register(Class<? extends LanguageDriver> cls) {\n    if (cls == null) {\n      throw new IllegalArgumentException(\"null is not a valid Language Driver\");\n    }\n    languageDriverMap.computeIfAbsent(cls, k -> {\n      try {\n        return k.getDeclaredConstructor().newInstance();\n      } catch (Exception ex) {\n        throw new ScriptingException(\"Failed to load language driver for \" + cls.getName(), ex);\n      }\n    });\n  }\n\n  public void register(LanguageDriver instance) {\n    if (instance == null) {\n      throw new IllegalArgumentException(\"null is not a valid Language Driver\");\n    }\n    Class<? extends LanguageDriver> cls = instance.getClass();\n    if (!languageDriverMap.containsKey(cls)) {\n      languageDriverMap.put(cls, instance);\n    }","sourceCodeStart":14,"sourceCodeEnd":50,"githubUrl":"https://github.com/mybatis/mybatis-3/blob/008069adb1b089579b5dcba87ee591908b263274/src/main/java/org/apache/ibatis/scripting/LanguageDriverRegistry.java#L14-L50","documentation":"LanguageDriverRegistry.register(Class) registers a scripting LanguageDriver class by instantiating it. Passing a null Class is meaningless — there is no driver to register — so it fails fast with IllegalArgumentException. This is a programming/API-contract error, not a configuration data issue.","triggerScenarios":"languageDriverRegistry.register((Class<? extends LanguageDriver>) null); configuration XML/programmatic setup that resolves a driver class name to null (class not found and silently swallowed) and then registers the null result.","commonSituations":"Custom Configuration subclasses or bootstraps that register drivers dynamically; typo'd class names where lookup code returns null instead of failing; test harnesses passing null by accident.","solutions":["Pass the actual driver class: registry.register(XmlLanguageDriver.class)","Fix the upstream class-name resolution so it never yields null (fail on Class.forName errors instead of swallowing them)","Add a null check with a meaningful error before calling register"],"exampleFix":"// before\nClass<? extends LanguageDriver> cls = lookup(name); // returns null on bad name\nregistry.register(cls);\n\n// after\nClass<? extends LanguageDriver> cls = Objects.requireNonNull(lookup(name), \"Unknown language driver: \" + name);\nregistry.register(cls);","handlingStrategy":"validation","validationCode":"Class<? extends LanguageDriver> cls = resolveDriverClass(name);\njava.util.Objects.requireNonNull(cls, \"Unknown language driver class: \" + name);\nregistry.register(cls);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Resolve driver classes with fail-fast Class.forName (no swallowed ClassNotFoundException)","Never pass through null from lookups into register","Validate driver configuration at application startup"],"tags":["configuration","language-driver","null-argument","mybatis"],"backgroundTag":null,"analyzedSha":"008069adb1b089579b5dcba87ee591908b263274","analyzedAt":"2026-08-14T13:07:10.264Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}