0

テキスト ファイルからの入力を受け入れ、ファイルの単語を昇順で重複なく表示するプログラムを作成しました。例外がスローされない場合、出力は正しいです。例外がスローされた場合、ユーザーは有効な入力を求められ、最初の方法が繰り返されます。これが発生し、有効な入力が最終的に入力されると、出力が複製されます。

何かがリセットされていないことはわかっていますが、それが何であるかわかりません。

public void go() {
    getWords();
    System.out.println(wordList);
    wordList = new ArrayList<String>(new HashSet<String>(wordList));
    Collections.sort(wordList);
    System.out.println(wordList);
}

void getWords() {
    try {
        File file = new File(getInput());
        BufferedReader reader = new BufferedReader(new FileReader(file));
        String line = null;
        while ((line = reader.readLine()) != null) {
            addWord(line);
        }
    } catch(Exception ex) {
        System.out.println("Invalid file name, try again.");
        go();
    }
}

void addWord(String lineToParse) {
    String[] tokens = lineToParse.split("\\s");
    for(int i = 0; i < tokens.length; i++) {
        wordList.add(tokens[i]);
    }
}
4

2 に答える 2

1

catch ブロックから呼び出すと、元の呼び出しがまだスタック上にあるgo()ことを忘れています。go()メソッドを再度呼び出したからといって、それが消えるわけではありません。基本的に、偶発的な再帰を実行しています。

したがって、この場合、もう一度呼び出すとgo()、通常どおりに実行され、スタックが「巻き戻され」、go メソッドの最初の呼び出しの残りが実行され、単語リストが出力され、並べ替えられてから出力されます。もう一度出します。

簡単な修正はgetWords()、ブール値 (例外がスローされた場合は false) を返してから、最初の行を に変更することwhile(!getWords());です。

于 2014-07-22T01:40:51.673 に答える