1

Sphinx を使用して文法ファイルを解析しています。

すべての文法ファイルをロードする関数があります。この関数は、プログラムの開始時と、ユーザーが を要求するたびに呼び出されますreload。最初に呼び出されたときに機能します。は、このStackOverflowError関数に対して後続の呼び出しが行われたときに発生します。エラーの原因となっている関数内の特定の行は、gram.listRuleNames()行、具体的には のメソッドですRuleGrammar listRuleNames()

なぜこれが起こっているのか、誰にも考えがありますか?

関数:

BaseRecognizer recognizer;

public static void main(String[] args) {
    recognizer = new BaseRecognizer();
    recognizer.allocate();
    LoadAllGrammars();
    Thread.sleep(1000);
    LoadAllGrammars();
    recognizer.deallocate();
}

private static void LoadAllGrammars() throws IOException {
    RuleGrammar[] gramss = recognizer.listRuleGrammars();
    for (RuleGrammar rg : gramss) {
        recognizer.deleteRuleGrammar(rg);
    }

    recognizer.commitChanges();

    RuleGrammar gram = null;

    URL dir = new File("grams").toURI().toURL();

    gram = recognizer.loadJSGF(dir, "main", true, true, null);

    String[] names = gram.listRuleNames();

    //the rest of the code in the function is irrelevant to the question
}

エラー:

 Exception in thread "Thread-23" java.lang.StackOverflowError
    at java.util.HashMap$KeyIterator.<init>(Unknown Source)
    at java.util.HashMap.newKeyIterator(Unknown Source)
    at java.util.HashMap$KeySet.iterator(Unknown Source)
    at java.util.AbstractCollection.toArray(Unknown Source)
    at com.sun.speech.engine.recognition.BaseRuleGrammar.listRuleNames(BaseRuleGrammar.java:266)
    at com.sun.speech.engine.recognition.BaseRecognizer.loadFullQualifiedRules(BaseRecognizer.java:958)
    at com.sun.speech.engine.recognition.BaseRecognizer.loadImports(BaseRecognizer.java:938)
    at com.sun.speech.engine.recognition.BaseRecognizer.loadFullQualifiedRules(BaseRecognizer.java:980)

いくつかのデバッグの後recognizer.deleteRuleGrammar(rg)、古い文法が削除されていないことに気付きました。

loadJSGF()2 回呼び出すとStackOverflowError. レコグナイザーが古い文法を削除しないことに関係があると思います。

4

0 に答える 0