{"record":{"id":"daf73c8803e71039","repo":"apache/hadoop","slug":"null-valueclass","errorCode":null,"errorMessage":"null valueClass","messagePattern":"null valueClass","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/ArrayWritable.java","lineNumber":52,"sourceCode":" *\n * For example:\n * <code>\n * public class IntArrayWritable extends ArrayWritable {\n *   public IntArrayWritable() { \n *     super(IntWritable.class); \n *   }\t\n * }\n * </code>\n */\n@InterfaceAudience.Public\n@InterfaceStability.Stable\npublic class ArrayWritable implements Writable {\n  private final Class<? extends Writable> valueClass;\n  private Writable[] values;\n\n  public ArrayWritable(Class<? extends Writable> valueClass) {\n    if (valueClass == null) { \n      throw new IllegalArgumentException(\"null valueClass\"); \n    }    \n    this.valueClass = valueClass;\n  }\n\n  public ArrayWritable(Class<? extends Writable> valueClass, Writable[] values) {\n    this(valueClass);\n    this.values = values;\n  }\n\n  public ArrayWritable(String[] strings) {\n    this(Text.class, new Writable[strings.length]);\n    for (int i = 0; i < strings.length; i++) {\n      values[i] = new UTF8(strings[i]);\n    }\n  }\n\n  public Class<? extends Writable> getValueClass() {\n    return valueClass;","sourceCodeStart":34,"sourceCodeEnd":70,"githubUrl":"https://github.com/apache/hadoop/blob/2add9630210752f88ceb1bb74eb65e37bf41da8e/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/io/ArrayWritable.java#L34-L70","documentation":"ArrayWritable stores an array of Writable instances all of a single value class, which it needs at read time to instantiate elements via ReflectionUtils. The constructor rejects a null valueClass immediately with IllegalArgumentException because deserialization would otherwise be impossible.","triggerScenarios":"new ArrayWritable(null) or new ArrayWritable(null, values); typically the class constant was computed and came back null (e.g. Class.forName wrapped in a try/catch that defaults to null).","commonSituations":"Building ArrayWritable dynamically per schema/config where the element class lookup fails silently; copy-pasted code omitting the class argument's import so a null variable is passed.","solutions":["Pass the concrete Writable element class, e.g. new ArrayWritable(Text.class).","Null-check any dynamically resolved class and fail loudly at configuration time with the class name that failed to resolve.","For string arrays, the convenience constructor new ArrayWritable(String[]) exists."],"exampleFix":"// before\nClass<? extends Writable> vc = resolve(name); // null on failure\nnew ArrayWritable(vc);\n\n// after\nClass<? extends Writable> vc = resolve(name);\nif (vc == null) throw new IllegalArgumentException(\"Cannot resolve element class \" + name);\nnew ArrayWritable(vc);","handlingStrategy":"validation","validationCode":"Class<? extends Writable> vc = resolveValueClass(schema);\nif (vc == null) throw new IllegalArgumentException(\"Element class not resolvable for \" + schema);\nArrayWritable aw = new ArrayWritable(vc);","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Fail class-resolution errors loudly at setup time instead of defaulting to null.","Prefer the constant form new ArrayWritable(Text.class) for known schemas."],"tags":["hadoop","serialization","writable","null-check","validation"],"backgroundTag":"null-argument-validation","analyzedSha":"2add9630210752f88ceb1bb74eb65e37bf41da8e","analyzedAt":"2026-08-22T19:55:07.957Z","schemaVersion":2},"datasetVersion":"2026-08-22T20:17:22.307Z"}