apache/flink · error · IllegalArgumentException

The field ({} is invalid.

Error message

The field  ({} is invalid.

What it means

Thrown by checkAndCoSort when an entry in the positions array is negative. Positions are CSV column indices and must be >= 0. (Note: the message string has a stray double space and a missing closing parenthesis before the placeholder — it prints as 'The field ( -1 is invalid.'.) This is a programming-error guard.

Source

Thrown at flink-core/src/main/java/org/apache/flink/api/common/io/GenericCsvInputFormat.java:538

            } else {
                // delimiter found.
                return i + delim.length;
            }
        }
    }

    @SuppressWarnings("unused")
    protected static void checkAndCoSort(int[] positions, Class<?>[] types) {
        if (positions.length != types.length) {
            throw new IllegalArgumentException(
                    "The positions and types must be of the same length");
        }

        TreeMap<Integer, Class<?>> map = new TreeMap<Integer, Class<?>>();

        for (int i = 0; i < positions.length; i++) {
            if (positions[i] < 0) {
                throw new IllegalArgumentException(
                        "The field " + " (" + positions[i] + ") is invalid.");
            }
            if (types[i] == null) {
                throw new IllegalArgumentException("The type " + i + " is invalid (null)");
            }

            if (map.containsKey(positions[i])) {
                throw new IllegalArgumentException(
                        "The position " + positions[i] + " occurs multiple times.");
            }

            map.put(positions[i], types[i]);
        }

        int i = 0;
        for (Map.Entry<Integer, Class<?>> entry : map.entrySet()) {
            positions[i] = entry.getKey();
            types[i] = entry.getValue();

View on GitHub (pinned to 2f3c205e92)

Solutions

  1. Validate every position is >= 0 before calling checkAndCoSort.
  2. Audit index arithmetic around the call for off-by-one and 0-vs-1 based indexing mistakes.
  3. Filter out sentinel/placeholder indices before passing them in.

Example fix

// before
int[] positions = computeIndices(); // may contain -1 sentinel
checkAndCoSort(positions, types);
// after
int[] positions = Arrays.stream(computeIndices()).filter(i -> i >= 0).toArray();
checkAndCoSort(positions, types);
Defensive patterns

Strategy: validation

Validate before calling

int[] sanitized = Arrays.stream(positions).filter(i -> i >= 0).toArray();
if (sanitized.length != positions.length) {
    throw new IllegalArgumentException("Negative position found in " + Arrays.toString(positions));
}
checkAndCoSort(sanitized, types);

Type guard

static int nonNegIndex(int i) {
    if (i < 0) throw new IllegalArgumentException("index must be >= 0, got " + i);
    return i;
}

Try / catch

try {
    checkAndCoSort(positions, types);
} catch (IllegalArgumentException e) {
    if (e.getMessage().contains("invalid")) {
        throw new IllegalArgumentException("A CSV column position is negative: " + Arrays.toString(positions), e);
    }
    throw e;
}

Prevention

When it happens

Trigger: A subclass passes a positions array containing a negative value, typically from an off-by-one decrement, an uninitialized int defaulting through logic, or a sentinel -1 not filtered out before the call.

Common situations: Index computed as something - 1 when something is 0; mixing 0-based and 1-based indexing; reusing a 'not set' sentinel (-1) without filtering; refactor that left a placeholder index.

Related errors


AI-assisted analysis of apache/flink@2f3c205e92 (2026-08-14). Data as JSON: /api/errors/7a046bacbd2af08c. Report an issue: GitHub.