You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JLanguageTool实现拼写检查时遇初始化异常求助

JLanguageTool运行异常排查与资源配置问题

问题场景

首次在Java环境中使用JLanguageTool开发基础拼写检查功能,已安装英语(美式)与希腊语语言包,代码编译无异常,但运行时触发ExceptionInInitializerError异常。

异常堆栈

Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.languagetool.rules.en.CompoundRule.<clinit>(CompoundRule.java:47)
    at org.languagetool.language.English.getRelevantRules(English.java:170)
    at org.languagetool.language.AmericanEnglish.getRelevantRules(AmericanEnglish.java:71)
    at org.languagetool.JLanguageTool.getAllBuiltinRules(JLanguageTool.java:496)
    at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:326)
    at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:299)
    at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:278)
    at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:357)
    at org.languagetool.JLanguageTool.<init>(JLanguageTool.java:244)
    at EngSpellchecker.<init>(SpellChecker.java:17)
    at main.main(SpellChecker.java:30)
Caused by: java.lang.RuntimeException: Object for class 'org.languagetool.language.AmericanEnglish' specified in jar:file:/home/alexisl/.m2/repository/org/languagetool/language-en/6.6/language-en-6.6.jar!/META-INF/org/languagetool/language-module.properties could not be created
    at org.languagetool.Languages.createLanguageObjects(Languages.java:153)
    at org.languagetool.Languages.getAllLanguages(Languages.java:126)
    at org.languagetool.Languages.<clinit>(Languages.java:45)
    ... 11 more
Caused by: java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:74)
    at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:502)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:486)
    at org.languagetool.Languages.createLanguageObjects(Languages.java:149)
    ... 13 more
Caused by: java.lang.RuntimeException: Language was already instantiated, see the cause stacktrace below.
    at org.languagetool.language.AmericanEnglish.<init>(AmericanEnglish.java:48)
    at java.base/jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance(DirectConstructorHandleAccessor.java:62)
    ... 16 more
Caused by: java.lang.Throwable
    at org.languagetool.language.AmericanEnglish.<init>(AmericanEnglish.java:50)
    ... 2 more

Process finished with exit code 1

源代码

import org.languagetool.JLanguageTool;
import org.languagetool.language.AmericanEnglish;
import org.languagetool.language.Greek;
import org.languagetool.rules.RuleMatch;

import java.io.IOException;
import java.util.List;

class GreekSpellChecker extends JLanguageTool {
    public GreekSpellChecker(){
        super(new Greek());
    }
}

class EngSpellchecker extends JLanguageTool{
    public EngSpellchecker(){
        super(new AmericanEnglish());
    }

    public void removeGrammarRules(){
        for(var rule : this.getAllRules()){
            if(!rule.isDictionaryBasedSpellingRule())
                this.disableRule(rule.getId());
        }
    }
}

class main{
    public static void main(String[] args)throws IOException {
        EngSpellchecker checker = new EngSpellchecker();
        checker.removeGrammarRules();

        List<RuleMatch> matches = checker.check("this is a textt with erors so manny erors thatt makee mee sick");
        for(RuleMatch match : matches){
            System.out.println("error in characters "+match.getFromPos()+"-"+match.getToPos()+": "+match.getMessage());
            System.out.println("Suggested replacement(s): "+match.getSuggestedReplacements());
        }

    }
}

用户疑问

  1. 需要下载哪些文件才能让代码正常运行?
  2. 这些文件应放置在什么路径下?

解决方案

核心异常修复

你遇到的Language was already instantiated异常,本质是JLanguageTool的语言类采用单例模式,不能通过new AmericanEnglish()直接实例化,这才是触发异常的根本原因,并非缺少字典或配置文件。

修改代码时,改用Languages.getLanguageForShortCode()获取单例实例:

import org.languagetool.JLanguageTool;
import org.languagetool.Languages;
import org.languagetool.rules.RuleMatch;

import java.io.IOException;
import java.util.List;

class EngSpellchecker extends JLanguageTool{
    public EngSpellchecker(){
        // 改用单例获取方式
        super(Languages.getLanguageForShortCode("en-US"));
    }

    public void removeGrammarRules(){
        for(var rule : this.getAllRules()){
            if(!rule.isDictionaryBasedSpellingRule())
                this.disableRule(rule.getId());
        }
    }
}

class main{
    public static void main(String[] args)throws IOException {
        EngSpellchecker checker = new EngSpellchecker();
        checker.removeGrammarRules();

        List<RuleMatch> matches = checker.check("this is a textt with erors so manny erors thatt makee mee sick");
        for(RuleMatch match : matches){
            System.out.println("error in characters "+match.getFromPos()+"-"+match.getToPos()+": "+match.getMessage());
            System.out.println("Suggested replacement(s): "+match.getSuggestedReplacements());
        }

    }
}

希腊语拼写检查类同理,改为Languages.getLanguageForShortCode("el")获取实例。

字典与配置文件补充(若后续仍有缺失问题)

如果修复后仍出现字典缺失相关错误,需补充以下资源:

  • 美式英语资源:.dict、.info后缀的字典文件,以及对应的grammar.xml规则配置文件
  • 希腊语资源:对应语言的.dict、.info后缀字典文件和grammar.xml配置文件

路径配置规则:

  1. Maven依赖方式:确保language-en和language-el依赖已正确引入,Maven会自动将jar包内的资源(包含字典、grammar.xml)加载到类路径,无需手动放置
  2. 手动管理资源:将字典文件和grammar.xml分别放在项目的src/main/resources/org/languagetool/language/en(美式英语)、src/main/resources/org/languagetool/language/el(希腊语)目录下,确保编译时能被打包到类路径中

内容的提问来源于stack exchange,提问作者ALEXIS LAZANAS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 06:32:02