0

スーパークラス:

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 のリストに +1k 個の要素が含まれている場合、idb のリストは空です...)

4

2 に答える 2

2

あなたはこう言います:

  1. 例外/スタック トレースはありません。
  2. 作成されたインスタンスのdictリストInteliCwDBは空です。

dictスーパークラス コンストラクターが何らかの理由で実行されなかった場合、 が であるインスタンスが作成されnullます。

他の例外がスローされ、キャッチされなかった場合、InteliCwDB調べる必要はありません。

したがって、一見すると、これはコンストラクターが実行されていることを意味するだけですが、読み取ったファイルは空です。つまり、2 つの異なる "src/cwdb.txt" ファイルが ... 異なるディレクトリにあるということです。


他の説明には、あなたの証拠に疑問を呈することが含まれます。例えば

  • あなたは症状を不正確に説明しています。
  • 実際に実行しているコードは、表示されているものとは大幅に異なります。dictたとえば、コンストラクターが作成して塗りつぶした後、飛び込んで空にする他のコードがあります。dict(あなたは非公開であると宣言していません...)。
    [更新- これが説明でした。OPのコメントを参照してください。彼はサブクラスでオーバーライドaddしており、そこにバグがありました。]
  • 実行しているコードがソース コードと一致しません。つまり、適切に再構築/再展開していません。

私のアドバイスは、プロセスと証拠を再確認することです。それでも問題が解決しない場合は、デバッガーを使用してアプリケーションを実行し、コンストラクターにブレークポイントを設定して、実際に何が起こっているかを理解できるようにシングル ステップします。

于 2012-10-28T00:30:03.243 に答える
0

catch (Exception e)デバッグのために、try-catch にa を追加する必要があります。ではない例外が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();
    }
}
于 2012-10-28T00:06:46.007 に答える