apache/flink · error · IndexOutOfBoundsException

{pos}

Error message

{pos}

What it means

Tuple6.getField(int pos) throws IndexOutOfBoundsException when the requested field position is outside 0..5. Tuples are fixed-arity containers, so any position beyond the last field (f5) or a negative position is rejected. The message is simply the invalid position number.

Source

Thrown at flink-core-api/src/main/java/org/apache/flink/api/java/tuple/Tuple6.java:121

    @Override
    @SuppressWarnings("unchecked")
    public <T> T getField(int pos) {
        switch (pos) {
            case 0:
                return (T) this.f0;
            case 1:
                return (T) this.f1;
            case 2:
                return (T) this.f2;
            case 3:
                return (T) this.f3;
            case 4:
                return (T) this.f4;
            case 5:
                return (T) this.f5;
            default:
                throw new IndexOutOfBoundsException(String.valueOf(pos));
        }
    }

    @Override
    @SuppressWarnings("unchecked")
    public <T> void setField(T value, int pos) {
        switch (pos) {
            case 0:
                this.f0 = (T0) value;
                break;
            case 1:
                this.f1 = (T1) value;
                break;
            case 2:
                this.f2 = (T2) value;
                break;
            case 3:
                this.f3 = (T3) value;

View on GitHub (pinned to 2f3c205e92)

Solutions

  1. Use 0-based indices: valid positions for Tuple6 are 0 through 5
  2. Bounds-check before the call: `if (pos >= 0 && pos < tuple.getArity())`
  3. If the index comes from a projection/config, validate it against Tuple.getArity() at parse time and fail with a clear message
  4. Prefer accessing the typed fields directly (tuple.f0 .. tuple.f5) when the position is known at compile time

Example fix

// before
Object v = tuple6.getField(6); // IndexOutOfBoundsException: 6

// after
Object v = (idx >= 0 && idx < tuple6.getArity())
        ? tuple6.getField(idx)
        : null; // or throw a descriptive exception
Defensive patterns

Strategy: validation

Validate before calling

// before any positional read
if (pos < 0 || pos >= tuple6.getArity()) {
    throw new IllegalArgumentException("pos " + pos + " outside Tuple6 arity 6");
}
Object v = tuple6.getField(pos);

Try / catch

catch (IndexOutOfBoundsException e) { /* message is the bad pos; log schema/index source and rethrow with context */ }

Prevention

When it happens

Trigger: Calling tuple6.getField(6) or getField(-1); generic code that indexes fields with a value derived from getArity() of a different tuple class; passing a 1-based field index into this 0-based API (e.g. getField(6) intending the 'sixth' field).

Common situations: Code written against Tuple5/Tuple7 reused with Tuple6; field positions read from configuration or a projection list (Table/SQL select indices) applied to the wrong tuple arity; off-by-one loops such as `for (int i = 1; i <= tuple.getArity(); i++)`.

Related errors


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