languagetool-org/languagetool · error · IllegalArgumentException

ConfusionCheckFilter: Index out of bounds in " + match.getRu

Error message

ConfusionCheckFilter: Index out of bounds in " + match.getRule().getFullId() + ", VerbFrom: " + posVerb

What it means

In the same validation block, InterrogativeVerbFilter parses the 1-based 'VerbFrom' argument and throws this IllegalArgumentException when it is < 1 or exceeds patternTokens.length — the verb position named by the rule does not exist among the matched pattern tokens.

Source

Thrown at languagetool-language-modules/fr/src/main/java/org/languagetool/rules/fr/InterrogativeVerbFilter.java:73

                                   AnalyzedTokenReadings[] patternTokens, List<Integer> tokenPositions) throws IOException {
    /*if (match.getSentence().getText().contains("Peut je")) {
      int ii=0;
      ii++;
    }*/
    List<String> replacements = new ArrayList<>();
    String pronounFrom = getRequired("PronounFrom", arguments);
    String verbFrom = getRequired("VerbFrom", arguments);
    String desiredPostag = null;
    List<String> extraSuggestions = new ArrayList<>();
    if (pronounFrom != null && verbFrom != null) {
      int posPronoun = Integer.parseInt(pronounFrom);
      if (posPronoun < 1 || posPronoun > patternTokens.length) {
        throw new IllegalArgumentException("ConfusionCheckFilter: Index out of bounds in " + match.getRule().getFullId()
            + ", PronounFrom: " + posPronoun);
      }
      int posVerb = Integer.parseInt(verbFrom);
      if (posVerb < 1 || posVerb > patternTokens.length) {
        throw new IllegalArgumentException(
            "ConfusionCheckFilter: Index out of bounds in " + match.getRule().getFullId() + ", VerbFrom: " + posVerb);
      }

      //AnalyzedTokenReadings atrVerb = patternTokens[posVerb - 1];
      AnalyzedTokenReadings atrPronoun = patternTokens[posPronoun - 1];
      
      // vous
      if (atrPronoun.matchesPosTagRegex("R pers obj 2 p")) {
        desiredPostag = "V.* (imp) [23] [sp]|V .*(ind|cond).* 2 p";
      }
      // nous
      else if (atrPronoun.matchesPosTagRegex("R pers obj 1 p")) {
        desiredPostag = "V.* (imp) .*|V .*(ind|cond).* 1 p";
      }
      // moi, toi, le, la, lui, nous, vous, les, leur
      else if (atrPronoun.matchesPosTagRegex("R pers obj.*")) {
        desiredPostag = "V.* (imp) .*";
      }

View on GitHub (pinned to 2e990059ce)

Solutions

  1. Set VerbFrom to a valid 1-based index within the pattern's token count.
  2. Renumber positional arguments after changing the pattern; verify with a rule unit test.
  3. Note the arg name in the message vs the adjacent variable naming; keep PronounFrom and VerbFrom distinct and correctly ordered.

Example fix

<!-- before: pattern has 4 tokens, arg points to 7 -->
<filter class="...InterrogativeVerbFilter" args="PronounFrom:1 VerbFrom:7"/>
<!-- after -->
<filter class="...InterrogativeVerbFilter" args="PronounFrom:1 VerbFrom:3"/>
Defensive patterns

Strategy: validation

Validate before calling

int verbFrom = Integer.parseInt(args.get("VerbFrom"));
int patternLen = patternTokens.length;
if (verbFrom < 1 || verbFrom > patternLen) {
    throw new IllegalArgumentException("VerbFrom must be 1.." + patternLen);
}

Try / catch

try { return filter.acceptRuleMatch(match, args, pos, tokens, tp); } catch (IllegalArgumentException e) { LOG.error("Rule " + match.getRule().getFullId() + ": " + e.getMessage()); return match; }

Prevention

When it happens

Trigger: acceptRuleMatch runs on a rule whose "VerbFrom:N" argument exceeds the number of tokens in the matched pattern (or is 0/negative), thrown right after the parallel PronounFrom check passes.

Common situations: Pattern edits shrinking the token list without renumbering VerbFrom; copy-pasted filter args between rules with different pattern lengths; off-by-one errors due to 1-based positions.

Understand the failure class

Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.

Related errors


AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06). Data as JSON: /api/errors/42e3fb064867ae8f. Report an issue: GitHub.