{"record":{"id":"b4897166bfa7cf86","repo":"apache/beam","slug":"unexpected-null-number-for-field-javabeanschema","errorCode":null,"errorMessage":"Unexpected null number for <field>","messagePattern":"Unexpected null number for <field>","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/JavaBeanSchema.java","lineNumber":80,"sourceCode":"          ReflectUtils.getMethods(typeDescriptor.getRawType()).stream()\n              .filter(ReflectUtils::isGetter)\n              .filter(m -> !m.isAnnotationPresent(SchemaIgnore.class))\n              .collect(Collectors.toList());\n      List<FieldValueTypeInformation> types = Lists.newArrayListWithCapacity(methods.size());\n      for (int i = 0; i < methods.size(); ++i) {\n        types.add(FieldValueTypeInformation.forGetter(typeDescriptor, methods.get(i), i));\n      }\n      types.sort(JavaBeanUtils.comparingNullFirst(FieldValueTypeInformation::getNumber));\n      validateFieldNumbers(types);\n      return types;\n    }\n\n    private static void validateFieldNumbers(List<FieldValueTypeInformation> types) {\n      for (int i = 0; i < types.size(); ++i) {\n        FieldValueTypeInformation type = types.get(i);\n        @javax.annotation.Nullable Integer number = type.getNumber();\n        if (number == null) {\n          throw new RuntimeException(\"Unexpected null number for \" + type.getName());\n        }\n        Preconditions.checkState(\n            number == i,\n            \"Expected field number %s for field %s instead got %s\",\n            i,\n            type.getName(),\n            number);\n      }\n    }\n\n    @Override\n    public int hashCode() {\n      return System.identityHashCode(this);\n    }\n\n    @Override\n    public boolean equals(@Nullable Object obj) {\n      return obj instanceof GetterTypeSupplier;","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/core/src/main/java/org/apache/beam/sdk/schemas/JavaBeanSchema.java#L62-L98","documentation":"Thrown by JavaBeanSchema.validateFieldNumbers when a field has no @SchemaFieldNumber annotation, so getNumber() returns null. All fields in a JavaBean schema must carry explicit, contiguous field numbers starting at 0.","triggerScenarios":"Annotating some but not all getters with @SchemaFieldNumber; schema introspection of the bean via get() then validates numbers and hits the null one.","commonSituations":"Adding a new field to an existing annotated bean without adding its number; forgetting the annotation on one of many fields; refactoring that removes an annotation.","solutions":["Add @SchemaFieldNumber(n) to every getter in the bean, using contiguous numbers 0..N-1.","Ensure numbers match field order (validateFieldNumbers also checks number == index).","Alternatively drop all @SchemaFieldNumber annotations to use default ordering, if the schema does not require stable numbering."],"exampleFix":"// before\npublic String getName() { ... } // missing annotation\n\n// after\n@SchemaFieldNumber(0)\npublic String getName() { ... }","handlingStrategy":"validation","validationCode":"int i = 0; for (Method m : clazz.getMethods()) { if (isGetter(m)) { SchemaFieldNumber n = m.getAnnotation(SchemaFieldNumber.class); if (n == null || n.value() != i++) { throw new IllegalStateException(\"Field \" + m.getName() + \" needs @SchemaFieldNumber(\" + i + \")\"); } } }","typeGuard":null,"tryCatchPattern":"try { schemaOf(clazz); } catch (RuntimeException e) { if (e.getMessage().startsWith(\"Unexpected null number for\") || e.getMessage().contains(\"Expected field number\")) { /* add/renumber @SchemaFieldNumber */ } else { throw e; } }","preventionTips":["Annotate every getter with @SchemaFieldNumber when using explicit numbering.","Renumber all fields whenever adding or reordering fields.","Write a test that registers every schema'd bean to catch numbering gaps early."],"tags":["java","beam-schema","annotations","field-numbering"],"backgroundTag":"missing-required-argument","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T21:17:11.552Z"}