pinpoint-apm/pinpoint · error · IllegalArgumentException

Setter must have return type void

Error message

Setter must have return type void: ${setterType.getName()}

What it means

IllegalArgumentException from SetterAnalyzer.analyze when the setter interface method returns something other than void. The generated field-setter bytecode relies on the void setX(v) convention, so a non-void return type is rejected to keep generated accessors consistent with the interface.

Solutions

  1. Change the setter method's return type to void
  2. Remove the return statement and keep the fluent call at the usage site instead
  3. Register a separate getter interface if you need the value returned

Example fix

// before
interface FooSetter { FooSetter setFoo(int v); }
// after
interface FooSetter { void setFoo(int v); }
Defensive patterns

Strategy: validation

Validate before calling

Method m = setterType.getDeclaredMethods()[0];
if (m.getReturnType() != void.class) {
    throw new IllegalArgumentException("setter must return void");
}

Type guard

boolean isVoidSetter(Class<?> t) {
    return t.isInterface() && t.getDeclaredMethods().length == 1
        && t.getDeclaredMethods()[0].getParameterCount() == 1
        && t.getDeclaredMethods()[0].getReturnType() == void.class;
}

Try / catch

try {
    SetterDetails d = new SetterAnalyzer().analyze(setterType);
} catch (IllegalArgumentException e) {
    logger.error("non-void setter on {}: {}", setterType, e.getMessage());
}

Prevention

When it happens

Trigger: Declaring a setter method with a non-void return type (e.g. fluent setter returning 'this' or returning the old value) and registering it as a field setter interface.

Common situations: Fluent-API style setters common in modern Java plugins; porting an accessor interface from another library that permits non-void setters.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of pinpoint-apm/pinpoint@744c3d3075 (2026-09-07). Data as JSON: /api/errors/3d1f7148662d603b. Report an issue: GitHub.

Appendix: source

Thrown at agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/instrument/SetterAnalyzer.java:60

        }

        final Method[] methods = setterType.getDeclaredMethods();
        if (methods.length != 1) {
            throw new IllegalArgumentException("Setter interface must have only one method: " + setterType.getName());
        }

        final Method setter = methods[0];
        if (setter.getParameterCount() != 1) {
            throw new IllegalArgumentException("Setter interface method must have exactly 1 argument: " + setterType.getName());
        }

        Class<?>[] arguments = setter.getParameterTypes();
        Class<?> fieldType = arguments[0];

        Class<?> returnType = setter.getReturnType();

        if (returnType != void.class) {
            throw new IllegalArgumentException("Setter must have return type void: " + setterType.getName());
        }

        return new SetterDetails(setter, fieldType);
    }

    public static final class SetterDetails {
        private final Method setter;
        private final Type fieldType;

        public SetterDetails(Method setter, Class<?> fieldType) {
            this.setter = setter;
            this.fieldType = Type.getType(Objects.requireNonNull(fieldType, "fieldType"));
        }

        public Method getSetter() {
            return setter;
        }

View on GitHub (pinned to 744c3d3075)