{"record":{"id":"543132640c9061da","repo":"apache/flink","slug":"the-given-class-is-no-array","errorCode":null,"errorMessage":"The given class is no array.","messagePattern":"The given class is no array\\.","errorType":"exception","errorClass":"InvalidTypesException","httpStatus":null,"severity":"error","filePath":"flink-core/src/main/java/org/apache/flink/api/common/typeinfo/BasicArrayTypeInfo.java","lineNumber":173,"sourceCode":"    }\n\n    @Override\n    public boolean canEqual(Object obj) {\n        return obj instanceof BasicArrayTypeInfo;\n    }\n\n    @Override\n    public String toString() {\n        return this.getClass().getSimpleName() + \"<\" + componentInfo + \">\";\n    }\n\n    // --------------------------------------------------------------------------------------------\n\n    @SuppressWarnings(\"unchecked\")\n    @PublicEvolving\n    public static <X, C> BasicArrayTypeInfo<X, C> getInfoFor(Class<X> type) {\n        if (!type.isArray()) {\n            throw new InvalidTypesException(\"The given class is no array.\");\n        }\n\n        // basic type arrays\n        return (BasicArrayTypeInfo<X, C>) TYPES.get(type);\n    }\n\n    private static final Map<Class<?>, BasicArrayTypeInfo<?, ?>> TYPES = new HashMap<>();\n\n    static {\n        TYPES.put(String[].class, STRING_ARRAY_TYPE_INFO);\n        TYPES.put(Boolean[].class, BOOLEAN_ARRAY_TYPE_INFO);\n        TYPES.put(Byte[].class, BYTE_ARRAY_TYPE_INFO);\n        TYPES.put(Short[].class, SHORT_ARRAY_TYPE_INFO);\n        TYPES.put(Integer[].class, INT_ARRAY_TYPE_INFO);\n        TYPES.put(Long[].class, LONG_ARRAY_TYPE_INFO);\n        TYPES.put(Float[].class, FLOAT_ARRAY_TYPE_INFO);\n        TYPES.put(Double[].class, DOUBLE_ARRAY_TYPE_INFO);\n        TYPES.put(Character[].class, CHAR_ARRAY_TYPE_INFO);","sourceCodeStart":155,"sourceCodeEnd":191,"githubUrl":"https://github.com/apache/flink/blob/2f3c205e9266cb30240eb7f4fdab15cad629a70f/flink-core/src/main/java/org/apache/flink/api/common/typeinfo/BasicArrayTypeInfo.java#L155-L191","documentation":"BasicArrayTypeInfo.getInfoFor(Class) checks type.isArray() and throws InvalidTypesException if the class is not an array. This factory resolves only boxed-primitive and String wrapper arrays (Boolean[], Byte[], String[], etc.) to their BasicArrayTypeInfo. Passing any non-array class (a List, a POJO, a scalar) violates the precondition.","triggerScenarios":"Calling BasicArrayTypeInfo.getInfoFor(someClass) where someClass is a Collection, a POJO, or a scalar; reflection-driven code that routes arbitrary classes through this factory without first checking isArray().","commonSituations":"Custom type-info builders that dispatch to BasicArrayTypeInfo without an isArray guard; serializing a field typed as List<T> or T (erased) and landing on this factory; misclassifying a POJO array vs. a basic array.","solutions":["Guard with type.isArray() before calling getInfoFor; route non-arrays to the appropriate factory (TypeExtractor, PojoTypeInfo, etc.).","For primitive arrays, use PrimitiveArrayTypeInfo.getInfoFor instead; for object arrays of non-basic types, use TypeExtractor.createTypeInfo.","Prefer the higher-level TypeInformation.of(TypeHint) or TypeExtractor.createTypeInfo, which dispatch correctly, over calling BasicArrayTypeInfo.getInfoFor directly."],"exampleFix":"// before\nBasicArrayTypeInfo.getInfoFor(MyPojo.class); // throws\n\n// after\nif (type.isArray()) {\n    BasicArrayTypeInfo.getInfoFor(type);\n} else {\n    TypeExtractor.createTypeInfo(type);\n}","handlingStrategy":"type-guard","validationCode":"Class<?> c = ...;\nif (!c.isArray()) {\n    throw new IllegalArgumentException(c + \" is not an array\");\n}\nBasicArrayTypeInfo.getInfoFor(c);","typeGuard":"static boolean isBasicObjectArray(Class<?> c) {\n    return c.isArray() && !c.getComponentType().isPrimitive();\n}","tryCatchPattern":"// Prefer dispatch via TypeExtractor rather than catching\ntry {\n    return BasicArrayTypeInfo.getInfoFor(type);\n} catch (InvalidTypesException e) {\n    return TypeExtractor.createTypeInfo(type);\n}","preventionTips":["Route all class-to-TypeInformation calls through TypeExtractor.createTypeInfo, which dispatches correctly.","Check isArray() and component-type primitives before choosing BasicArray vs PrimitiveArray factory.","Avoid calling BasicArrayTypeInfo.getInfoFor directly unless you know the class is an object array."],"tags":["type-information","array-type","validation","type-extractor"],"backgroundTag":null,"analyzedSha":"2f3c205e9266cb30240eb7f4fdab15cad629a70f","analyzedAt":"2026-08-14T08:48:24.518Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}