languagetool-org/languagetool · error

Language

Error message

Language 

What it means

ProhibitedCompoundRuleEvaluator's constructor loads the language's language-model rules and throws when getRelevantLanguageModelRules returns null, meaning the language has no rules backed by an n-gram language model. Evaluating prohibited-compound rules for that language is impossible without model-backed rules.

Source

Thrown at languagetool-dev/src/main/java/org/languagetool/dev/bigdata/ProhibitedCompoundRuleEvaluator.java:70

 * @since 4.3
 * @author Fabian Richter
 */
class ProhibitedCompoundRuleEvaluator {
  // TODO maybe remove
  private static final List<Long> EVAL_FACTORS = Arrays.asList(10L);//, 100L, 1_000L, 10_000L, 100_000L, 1_000_000L, 10_000_000L);
  private static final int MAX_SENTENCES = 10;//00;

  private final Language language;
  private final ProhibitedCompoundRule rule;
  private final Map<Long, RuleEvalValues> evalValues = new HashMap<>();
  private boolean verbose = true;

  ProhibitedCompoundRuleEvaluator(Language language, LanguageModel languageModel) {
    this.language = language;
    try {
      List<Rule> rules = language.getRelevantLanguageModelRules(JLanguageTool.getMessageBundle(), languageModel, null);
      if (rules == null) {
        throw new RuntimeException("Language " + language + " doesn't seem to support a language model");
      }
      ProhibitedCompoundRule foundRule = null;
      for (Rule rule : rules) {
        if (rule.getId().equals(ProhibitedCompoundRule.RULE_ID)) {
          foundRule = (ProhibitedCompoundRule) rule;
          break;
        }
      }
      if (foundRule == null) {
        throw new RuntimeException("Language " + language + " has no language model rule with id " + ProhibitedCompoundRule.RULE_ID);
      } else {
        this.rule = foundRule;
      }
    } catch (IOException e) {
      throw new RuntimeException(e);
    }
  }

View on GitHub (pinned to 2e990059ce)

Solutions

  1. Choose a language that supports language-model rules (e.g. German) when running this evaluator
  2. Implement/enable getRelevantLanguageModelRules for the target language
  3. Skip evaluation for languages without language model support in your batch script

Example fix

// before
new ProhibitedCompoundRuleEvaluator(new English(), languageModel); // no LM rules -> throws
// after
new ProhibitedCompoundRuleEvaluator(new German(), languageModel); // German has LM rules
Defensive patterns

Strategy: validation

Validate before calling

List<Rule> rules = language.getRelevantLanguageModelRules(JLanguageTool.getMessageBundle(), languageModel, null);
if (rules == null || rules.isEmpty()) {
  throw new IllegalStateException("Language " + language + " has no language-model rules");
}

Try / catch

try {
  new ProhibitedCompoundRuleEvaluator(language, languageModel);
} catch (RuntimeException e) {
  if (e.getMessage().contains("doesn't seem to support a language model")) {
    System.err.println("Skipping " + language + ": no LM support");
  }
}

Prevention

When it happens

Trigger: Constructing the evaluator with a language whose getRelevantLanguageModelRules returns null (no language-model rules registered), typically because no languageModel support is defined for that language.

Common situations: Running the evaluator for a language that hasn't implemented language-model rules; using a plain Language variant instead of one configured for n-gram rules.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


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