有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

超类:

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的列表是空的…)


共 (2) 个答案

  1. # 1 楼答案

    为了调试的目的,您应该在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();
        }
    }
    
  2. # 2 楼答案

    你说:

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

    如果超类构造函数没有运行,则会有一个实例,其dictnull

    如果抛出了其他异常但未捕获,那么您就不会有InteliCwDB要检查

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


    其他解释包括质疑你的证据;e、 g

    • 你描述的症状不准确
    • 您实际运行的代码与您向我们展示的代码大不相同;e、 g.在构造函数创建并填充dict之后,还有一些其他代码跳入并清空它。(您尚未将dict声明为私有…)
      [UPDATE-这就是解释:请参见OP的评论。他已经覆盖了子类中的add,这就是错误所在。]
    • 您正在运行的代码与源代码不匹配;i、 e.您没有正确地重建/重新部署

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