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

当您go()从 catch 块调用时,您忘记了原始go()调用仍在堆栈中。它不会因为您再次调用该方法而消失。本质上,您正在执行一些意外递归。

所以在这种情况下,你将调用go()第二次,它会正常执行,然后堆栈将“展开”并执行第一次调用 go 方法的剩余部分,打印出 wordlist,对其进行排序,然后打印又出来了。

一个快速的解决方法可能是getWords()返回一个布尔值(如果抛出异常则返回 false),然后只需将第一行更改为while(!getWords());.

于 2014-07-22T01:40:51.673 回答
0

这是因为您在 catch 块中调用 go, 方法导致再次打印输出,您可以像这样更正它,

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.");
        getwords(); //Changed
    }
}

void addWord(String lineToParse) {
    String[] tokens = lineToParse.split("\\s");
    for(int i = 0; i < tokens.length; i++) {
        wordList.add(tokens[i]);
    }
}
于 2014-07-22T01:47:15.337 回答