java - super() 在子类的构造函数中不起作用

标签 java super

父类(super class):

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 根本不行。 你能告诉我出了什么问题吗? (我没有收到任何错误/异常,只是当 db 的列表有 ober +1k 元素时,idb 的列表为空...)

最佳答案

你说的是:

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

如果父类(super class)构造函数不知何故没有运行,您将拥有一个 dictnull 的实例。

如果抛出了一些其他异常但未被捕获,那么您就没有 InteliCwDB 来检查。

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

<小时/>

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

  • 您对症状的描述不准确。
  • 您实际运行的代码与您向我们展示的代码有很大不同;例如在构造函数创建并填充字典后,还有一些其他代码会跳入并清空字典。 (您尚未将 dict 声明为私有(private)...)。
    [ 更新 - 这就是解释:请参阅OP的评论。他在子类中重写了add,这就是错误所在。 ]
  • 您正在运行的代码与您的源代码不匹配;即您没有正确重建/重新部署。
<小时/>

我的建议是重新检查您的流程和证据。如果这没有帮助,那么使用调试器运行应用程序,在构造函数上设置断点,然后单步执行,以便您可以弄清楚到底发生了什么。

关于java - super() 在子类的构造函数中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105246/

相关文章:

python - 调用 super 的 forward() 方法

javascript - ES6 super() 在构造函数中实际上做了什么?

java - 构造一个二维数组并赋值

javax.naming.NameNotFoundException : ConnectionFactory with Wildfly 9. 0.1.Final

java - HBase 中按创建日期而不是时间戳删除行

java - super 通配符导致的编译错误

python - 为什么 super() 的隐式性质是一个令人满意的特性?

java - 为什么 super 不引用父类(super class)中的变量?

java - 如何读取扩展名为*.xlsx的Excel文件?

java - 游戏开发中的CPU还是RAM?