languagetool-org/languagetool · error · IOException
Format error in file " + path + ", line: " + line
Error message
Format error in file " + path + ", line: " + line
What it means
WordCoherencyDataLoader.loadWords reads a coherency data file where each line must contain exactly two semicolon-separated fields ('word;word'). This IOException is thrown for any non-empty, non-comment line that does not split into exactly 2 parts.
Source
Thrown at languagetool-core/src/main/java/org/languagetool/rules/WordCoherencyDataLoader.java:52
* @since 3.0
*/
public class WordCoherencyDataLoader {
public Map<String, Set<String>> loadWords(String path) {
InputStream stream = JLanguageTool.getDataBroker().getFromRulesDirAsStream(path);
Map<String, Set<String>> map = new Object2ObjectOpenHashMap<>();
try (
InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8);
BufferedReader br = new BufferedReader(reader)
) {
String line;
while ((line = br.readLine()) != null) {
if (line.isEmpty() || line.charAt(0) == '#') { // ignore comments
continue;
}
String[] parts = line.split(";");
if (parts.length != 2) {
throw new IOException("Format error in file " + path + ", line: " + line);
}
if(map.containsKey(parts[0])) {
map.get(parts[0]).add(parts[1]);
} else {
map.put(parts[0], Stream.of(parts[1]).collect(Collectors.toCollection(ObjectOpenHashSet::new)));
}
if(map.containsKey(parts[1])) {
map.get(parts[1]).add(parts[0]);
} else {
map.put(parts[1], Stream.of(parts[0]).collect(Collectors.toCollection(ObjectOpenHashSet::new)));
}
}
} catch (IOException e) {
throw new RuntimeException("Could not load coherency data from " + path, e);
}
return Collections.unmodifiableMap(map);
}
View on GitHub (pinned to 2e990059ce)
Solutions
- Locate the offending line (printed in the exception message) in the file at 'path'.
- Ensure it has exactly one semicolon separating the two forms, e.g. 'color;colour'.
- Remove extra semicolons or fix a wrong separator (e.g. ',' -> ';').
Example fix
// before (data file) color:colour // after (data file) color;colour
Defensive patterns
Strategy: validation
Validate before calling
// validate coherency data lines before loading
for (String line : Files.readAllLines(Paths.get(path))) {
if (line.isEmpty() || line.startsWith("#")) continue;
if (line.split(";", -1).length != 2)
throw new IllegalStateException("Bad coherency line: " + line);
} Try / catch
try { loader.loadWords(path, language); } catch (IOException e) { log.error("Coherency data format error: " + e.getMessage()); throw new UncheckedIOException(e); } Prevention
- Use ';' as the only separator in coherency files
- Check for trailing semicolons on lines
- Add CI format checks for language data files
When it happens
Trigger: Calling loadFromPath/loadWords on a coherency file containing a line with zero or multiple semicolons, e.g. 'word' or 'a;b;c' (no comments allowed except lines starting with '#').
Common situations: Misspelled separator (comma or tab instead of semicolon); trailing semicolon on a line; contributors editing language coherency data by hand.
Understand the failure class
Background: "Invalid ... format", "must be in format X", "does not look like a ..." — invalid argument format errors across CLI tools and libraries — this error's family across 17 libraries.
Related errors
- Could not load simple replacement data from: " + path + ". E
- Format error in file " + path + ", line: " + line + ", " + "
- Incorrect number of fields: " + line
- Form has more than 1 modern form:" + line
- Replacement has more than 1 modern form:" + line
AI-assisted analysis of languagetool-org/languagetool@2e990059ce (2026-09-06).
Data as JSON: /api/errors/a96b3487356bf426.
Report an issue: GitHub.