0

超类:

public class CwDB{
protected LinkedList<Entry> dict = null;

public CwDB(String filename){
        this.dict = new LinkedList<Entry>();
        try{
            FileReader fr = new FileReader(filename);
            BufferedReader br = new BufferedReader(fr);
            String w = null;
            while((w = br.readLine()) != null ){
                String c = br.readLine();
                this.add(w,c); //adds new Entry to dict
            }
            br.close();
            fr.close();
        }catch(IOException e){
            e.printStackTrace();
        }
}
public void add(String word, String clue){
    this.dict.add(new Entry(word,clue));
}
...
}

子类:

public class InteliCwDB extends CwDB {

public InteliCwDB(String filename){
    super(filename);
}
}

情况1:

CwDB db = new CwDB("src/cwdb.txt");

案例二:

InteliCwDB idb = new InteliCwDB("src/cwdb.txt");

问题是案例 1 完美地工作,但案例 2 根本没有。你能告诉我有什么问题吗?(我没有得到任何错误/异常,只是 idb 的列表是空的,当 db 的列表有 ober +1k 元素时......)

4

2 回答 2

2

你说:

  1. 没有异常/堆栈跟踪。
  2. dict创建的实例中的列表InteliCwDB为空。

如果超类构造函数以某种方式没有运行,那么您将拥有一个带有dictthat is的实例null

如果其他一些异常被抛出并且没有被捕获,那么你就不需要InteliCwDB检查了。

所以从表面上看,这只能意味着构造函数正在运行,但它读取的文件是空的。换句话说,您在不同的目录中有两个不同的“src/cwdb.txt”文件。


其他解释涉及质疑您的证据;例如

  • 你描述的症状不准确。
  • 您实际运行的代码与您向我们展示的代码大不相同;dict例如,在构造函数创建并填充它之后,还有一些其他代码正在跳入并清空。(你还没有宣布dict是私人的......)。
    [更新- 这是解释:请参阅 OP 的评论。他add在子类中被覆盖,这就是错误所在。]
  • 您正在运行的代码与您的源代码不匹配;即您没有正确重建/重新部署。

我的建议是重新检查您的流程和证据。如果这没有帮助,则使用调试器运行应用程序,在构造函数上设置断点,然后单步执行,这样您就可以了解实际发生的情况。

于 2012-10-28T00:30:03.243 回答
0

catch (Exception e)出于调试目的,您应该将 a 添加到您的 try-catch 中。不属于的异常IOException可能会导致您出现问题。所以,试试这样:

public CwDB(String filename){
    this.dict = new LinkedList<Entry>();
    try{
        FileReader fr = new FileReader(filename);
        BufferedReader br = new BufferedReader(fr);
        String w = null;
        while((w = br.readLine()) != null ){
            String c = br.readLine();
            this.add(w,c); //adds new Entry to dict
        }
        br.close();
        fr.close();
    }catch(IOException e){
        e.printStackTrace();
    }catch(Exception e){
        e.printStackTrace();
    }
}
于 2012-10-28T00:06:46.007 回答