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 - совсем нет. Можете ли вы сказать мне, что не так? (Я не получаю никаких ошибок / исключений, просто список idb пуст, когда список db содержит элементы ober +1k...)

2 ответа

Решение

Вы говорите, что:

  1. Нет никаких исключений / следов стека.
  2. dict список в созданном InteliCwDB Экземпляр пуст.

Если конструктор суперкласса как-то не запустится, у вас будет экземпляр с dict это было null,

Если бы какое-то другое исключение было брошено и не поймано, то у вас не было бы InteliCwDB изучить.

Таким образом, на первый взгляд это может означать только то, что конструктор работает, но файл, который он читает, пуст. Другими словами, у вас есть два разных файла "src / cwdb.txt"... в разных каталогах.


Другие объяснения включают в себя допрос ваших доказательств; например

  • Вы описываете симптомы неточно.
  • Код, который вы на самом деле выполняете, существенно отличается от того, что вы нам показываете; например, есть какой-то другой код, который прыгает и очищает dict после того, как конструктор создал и заполнил его. (Вы не объявили dict быть частным...).
    [ ОБНОВЛЕНИЕ - это было объяснение: см. Комментарии ОП. Он переопределил add в подклассе, и вот где была ошибка. ]
  • Код, который вы запускаете, не соответствует вашему исходному коду; т.е. вы не перестраиваете / перераспределяете должным образом.

Мой совет - перепроверить ваши процессы и ваши доказательства. И если это не поможет, тогда запустите приложение с помощью отладчика, установите точку останова на конструкторе и выполните один шаг, чтобы вы могли понять, что на самом деле происходит.

Вы должны добавить catch (Exception e) к вашему 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();
    }
}
Другие вопросы по тегам