pinpoint-apm/pinpoint · error · IllegalArgumentException

functionalInterfaceName must not be empty

Error message

functionalInterfaceName must not be empty

What it means

Constructor guard in LambdaExpressionMatcher: the functionalInterfaceName argument is null or empty, so the matcher cannot build its InterfaceInternalNameMatcherOperand identifying which functional interface the lambda implements.

Solutions

  1. Supply the functional interface internal name (e.g. 'java/lang/Runnable') when constructing the matcher
  2. Validate plugin configuration for empty interface names
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/instrument/matcher/LambdaExpressionMatcher.java:22 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/instrument/matcher/LambdaExpressionMatcher.java:22

import com.navercorp.pinpoint.bootstrap.instrument.matcher.operand.MatcherOperand;
import com.navercorp.pinpoint.bootstrap.instrument.matcher.operand.PackageInternalNameMatcherOperand;
import com.navercorp.pinpoint.common.util.StringUtils;

import java.util.Objects;

public class LambdaExpressionMatcher implements PackageBasedMatcher {
    static final String LAMBDA_INSTANCE_NAME_PREFIX = "$$Lambda$";
    private final String basePackageName;
    private final MatcherOperand matcherOperand;

    public LambdaExpressionMatcher(String baseClassName, String functionalInterfaceName) {
        Objects.requireNonNull(baseClassName, "baseClassName");
        if (!StringUtils.hasText(baseClassName)) {
            throw new IllegalArgumentException("baseClassName must not be empty");
        }
        Objects.requireNonNull(functionalInterfaceName, "functionalInterfaceName");
        if (!StringUtils.hasText(functionalInterfaceName)) {
            throw new IllegalArgumentException("functionalInterfaceName must not be empty");
        }
        this.basePackageName = baseClassName + LAMBDA_INSTANCE_NAME_PREFIX;

        final MatcherOperand operand = new PackageInternalNameMatcherOperand(basePackageName);
        final MatcherOperand functionalInterfaceMatcherOperand = new InterfaceInternalNameMatcherOperand(functionalInterfaceName, false);
        this.matcherOperand = operand.and(functionalInterfaceMatcherOperand);
    }

    @Override
    public String getBasePackageName() {
        return this.basePackageName;
    }

    @Override
    public MatcherOperand getMatcherOperand() {
        return this.matcherOperand;
    }

View on GitHub (pinned to 744c3d3075)