{"record":{"id":"a3fa2a82bd901a2e","repo":"languagetool-org/languagetool","slug":"references-must-be-larger-than-0-attrs-getvalue","errorCode":null,"errorMessage":"References must be larger than 0: ${attrs.getValue(\"no\")}\n Line: ${pLocator.getLineNumber()}, column: ${pLocator.getColumnNumber()}.","messagePattern":"References must be larger than 0: (.+?)\n Line: (.+?), column: (.+?)\\.","errorType":"exception","errorClass":"SAXException","httpStatus":null,"severity":"error","filePath":"languagetool-core/src/main/java/org/languagetool/rules/patterns/XMLRuleHandler.java","lineNumber":425,"sourceCode":"      suggestionsOutMsg.append(attrs.getValue(\"no\"));\n      checkNumber(attrs);\n    } else if (inToken && attrs.getValue(\"no\") != null) {\n      int refNumber = Integer.parseInt(attrs.getValue(\"no\"));\n      checkRefNumber(refNumber);\n      mWorker.setTokenRef(refNumber);\n      tokenReference = mWorker;\n      elements.append('\\\\');\n      elements.append(refNumber);\n    }\n  }\n\n  private void checkNumber(Attributes attrs) throws SAXException {\n    if (StringTools.isEmpty(attrs.getValue(\"no\"))) {\n      throw new SAXException(\"References cannot be empty: \" + \"\\n Line: \"\n          + pLocator.getLineNumber() + \", column: \"\n          + pLocator.getColumnNumber() + \".\");\n    } else if (Integer.parseInt(attrs.getValue(\"no\")) < 1 && regex.length() == 0) {\n      throw new SAXException(\"References must be larger than 0: \"\n          + attrs.getValue(\"no\") + \"\\n Line: \" + pLocator.getLineNumber()\n          + \", column: \" + pLocator.getColumnNumber() + \".\");\n    }\n  }\n\n  private void checkRefNumber(int refNumber) throws SAXException {\n    if (refNumber > patternTokens.size()) {\n      throw new SAXException(\"Only backward references in match elements are possible, tried to specify token \"\n          + refNumber + \"\\n\" + \"Line: \" + pLocator.getLineNumber()\n          + \", column: \" + pLocator.getColumnNumber() + \".\");\n    }\n  }\n\n  protected void setExceptions(Attributes attrs) {\n    inException = true;\n    exceptions = new StringBuilder();\n    resetException();\n","sourceCodeStart":407,"sourceCodeEnd":443,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-core/src/main/java/org/languagetool/rules/patterns/XMLRuleHandler.java#L407-L443","documentation":"XMLRuleHandler.checkNumber throws this SAXException when a reference element's 'no' attribute parses to a value less than 1 (e.g. 0 or negative) and no regex attribute is present. Token references are 1-based backward references into the pattern, so 0 or negative values are meaningless. The exception includes the offending value plus line/column of the XML.","triggerScenarios":"A <match no=\"0\"/> (or negative) in rule XML is parsed and regex.length() == 0, so the value cannot be interpreted as a regex-alternative and checkNumber rejects it.","commonSituations":"Authors thinking references are 0-based like array indices; generated XML starting counters at 0; hand-written rules converting from other grammar formats.","solutions":["Change the 'no' value to 1 or higher (1-based, referring to a previous token)","If you intended an offset via regex, supply the regex attribute instead of a bare number","Run LanguageTool's rule tests to validate all reference numbers after editing"],"exampleFix":"// before\n<match no=\"0\"/>\n// after\n<match no=\"1\"/>","handlingStrategy":"validation","validationCode":"int no = Integer.parseInt(attrs.getValue(\"no\"));\nif (no < 1) throw new IllegalArgumentException(\"'no' must be >= 1, got \" + no);","typeGuard":"boolean isPositiveRef(String no) {\n  try { return Integer.parseInt(no) >= 1; } catch (NumberFormatException e) { return false; }\n}","tryCatchPattern":"try {\n  loader.getRules(is, filename);\n} catch (SAXException e) {\n  if (e.getMessage().startsWith(\"References must be larger than 0\")) {\n    log.error(\"Token references are 1-based; fix the 'no' value\", e);\n  } else throw e;\n}","preventionTips":["Remember token references are 1-based, never 0","Check generated XML counters start at 1","Run rule tests after any reference renumbering"],"tags":["languagetool","xml-rules","validation","value-out-of-range"],"backgroundTag":"value-out-of-range","analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}