quarkusio/quarkus · error · IllegalArgumentException

value was null

Error message

value was null

What it means

LinkDelegate.fromString(String) implements RuntimeDelegate's HeaderDelegate contract and explicitly rejects a null input with IllegalArgumentException("value was null"), because a null header value cannot be parsed into a Link.

Source

Thrown at independent-projects/resteasy-reactive/common/runtime/src/main/java/org/jboss/resteasy/reactive/common/headers/LinkDelegate.java:129

                        char c = value.charAt(curr);
                        if (c == ',' || c == ';')
                            break;
                        buf.append(value.charAt(curr));
                        curr++;
                    }
                    val = buf.toString();
                }
            }
            attributes.add(name, val);

        }

    }

    @Override
    public Link fromString(String value) throws IllegalArgumentException {
        if (value == null)
            throw new IllegalArgumentException("value was null");
        Parser parser = new Parser(value);
        parser.parse();
        return parser.getLink();
    }

    @Override
    public String toString(Link value) throws IllegalArgumentException {
        if (value == null)
            throw new IllegalArgumentException("value was null");
        StringBuilder buf = new StringBuilder("<");
        buf.append(value.getUri().toString()).append(">");

        for (Map.Entry<String, String> entry : value.getParams().entrySet()) {
            buf.append("; ").append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
        }

        return buf.toString();
    }

View on GitHub (pinned to e1c734241f)

Solutions

  1. Check the header value for null before parsing: String v = headers.getHeaderString("Link"); if (v != null) Link.valueOf(v).
  2. Provide an empty/default handling path when the header is absent instead of invoking the delegate.
  3. Catch IllegalArgumentException if null cannot be ruled out at the call site.
  4. In tests, assert header presence before parsing to localize the failure.

Example fix

// before
Link link = linkDelegate.fromString(response.getHeaderString("Link")); // NPE-risk: throws when null
// after
String raw = response.getHeaderString("Link");
Link link = raw == null ? null : linkDelegate.fromString(raw);
Defensive patterns

Strategy: type-guard

Validate before calling

String raw = headers.getHeaderString("Link");
if (raw == null || raw.isBlank()) { /* header absent: skip parsing */ }

Type guard

Link tryParseLink(String value) {
    return value == null || value.isBlank() ? null : Link.valueOf(value);
}

Try / catch

try {
    Link link = linkDelegate.fromString(raw);
} catch (IllegalArgumentException e) {
    log.warn("Cannot parse Link header", e);
}

Prevention

When it happens

Trigger: Calling LinkDelegate.INSTANCE.fromString(null) directly, or framework code invoking the delegate with a null header value read from an incoming request/response.

Common situations: Client code parsing an optional Link header without checking HttpHeaders.getRequestHeader/getHeaderString for null first; tests passing null; header absent on responses (e.g. no pagination Link).

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/f692bb239fc86883. Report an issue: GitHub.