pinpoint-apm/pinpoint · error · IllegalStateException

operand is null

Error message

operand is null

What it means

Guard in DefaultMultiClassBasedMatcher.getMatcherOperand: joining the class-name matcher operands produced null (no valid operand could be derived from baseClassNames), so the matcher cannot be assembled. It indicates the operand-building helper returned null for the given inputs.

Solutions

  1. Verify baseClassNames entries are non-empty valid class names
  2. Avoid passing only blank/null entries that collapse the OR-join to null
  3. Upgrade the pinpoint agent version in case of a matcher operand building bug
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at agent-module/bootstraps/bootstrap-core/src/main/java/com/navercorp/pinpoint/bootstrap/instrument/matcher/DefaultMultiClassBasedMatcher.java:49 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/a680d2e4c1b7efcb. Report an issue: GitHub.

Appendix: source

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

    private final MatcherOperand matcherOperand;

    DefaultMultiClassBasedMatcher(final List<String> baseClassNames) {
        this(baseClassNames, null);
    }

    DefaultMultiClassBasedMatcher(final List<String> baseClassNames, final MatcherOperand additional) {
        if (CollectionUtils.isEmpty(baseClassNames)) {
            throw new IllegalArgumentException("basePackageNames must not be empty");
        }
        this.baseClassNames = baseClassNames;

        this.matcherOperand = getMatcherOperand(baseClassNames, additional);
    }

    private MatcherOperand getMatcherOperand(List<String> baseClassNames, MatcherOperand additional) {
        MatcherOperand operand = joinOr(baseClassNames);
        if (operand == null) {
            throw new IllegalStateException("operand is null");
        }
        if (additional == null) {
            return operand;
        }
        // (class OR ...) AND additional
        operand = operand.and(additional);
        return operand;
    }

    private MatcherOperand joinOr(List<String> baseClassNames) {
        MatcherOperand operand = null;
        for (String baseClassName : baseClassNames) {
            if (operand == null) {
                operand = new ClassInternalNameMatcherOperand(baseClassName);
            } else {
                // class OR ...
                final MatcherOperand classMatcherOperand = new ClassInternalNameMatcherOperand(baseClassName);
                operand = operand.or(classMatcherOperand);

View on GitHub (pinned to 744c3d3075)