繁体   English   中英

super()不在子类'构造函数中工作

[英]super() not working in subclass' constructor

超类:

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");

案例2:

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

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

你这么说:

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

如果超类构造函数以某种方式没有运行,那么你将拥有一个dictnull的实例。

如果抛出了一些其他异常并且未被捕获,那么您将无法检查InteliCwDB

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


其他解释涉及询问您的证据; 例如

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

我的建议是重新检查您的流程和证据。 如果这没有帮助,那么使用调试器运行应用程序,在构造函数上设置断点,然后单步执行它以便您可以计算出真正发生的事情。

您应该为try-catch添加一个catch (Exception e)以进行调试。 不是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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM