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 ответа
Вы говорите, что:
- Нет никаких исключений / следов стека.
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();
}
}