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
- Change the setter method's return type to void
- Remove the return statement and keep the fluent call at the usage site instead
- 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
- Avoid fluent setter style (returning this) in field setter interfaces
- Perform the fluent chaining at the call site, not inside the setter
- Add a shape-check unit test for every accessor interface
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
- Setter interface method must have exactly 1 argument
- Setter interface must have only one method
- method not found.
- must return java.lang.Object.
- agentInfoRefreshIntervalMs must be greater than 0
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)