2

私の問題は、このコードに間違いが見つからないことです。ファイルから読み取った文字列をコンストラクターのプログラム (文字列のセット) のフィールドに入力したいと考えています。

`

public AnagramUserInput(){
    Set<String> result = new TreeSet<String>();
    Set<String> lexic = new TreeSet<String>();
    File lexicon = new File("C:/Users/Konstanty Orzeszko/Desktop/do testu/english_words_WIN.txt");
    try{
        BufferedReader br = new BufferedReader(new FileReader(lexicon));
        String word;

        while(((word = br.readLine()) != null)) {
            this.lexic.add(word);//Exception is throwned right in this line
         }
        br.close();
    }catch(IOException exc) {
        System.out.println(exc.toString());
        System.exit(1);
    }
}`

何が間違っているか/どのように修正するか教えていただけますか? どうもありがとう。

4

4 に答える 4

2

this.lexicに評価されnullます。this.lexisコンストラクターのローカルlexic変数ではなく、インスタンスのローカル変数を指すことに注意してください。

String をコンストラクターのlexic変数に追加する場合thisは、キーワードを削除するだけです。

lexic.add(word);
于 2013-10-19T17:16:31.570 に答える
1

おそらくlexic、クラス インスタンス変数として名前が付けられた別の変数があります。(そうでない場合、上記のコードはコンパイルされません)

resultしたがって、変数をシャドウしている可能性があります。交換

Set<String> lexic = new TreeSet<String>();

lexic = new TreeSet<String>();
于 2013-10-19T17:16:11.550 に答える
1

ここで私が見る唯一の問題は

this.lexic.add(word); // this.lexic

を取り外しますthis。コンストラクターがクラスをインスタンス化するためです。オブジェクトが作成される前であっても、 を使用しようとしていますがthis、これは間違っています。

于 2013-10-19T17:16:29.097 に答える
0
this.lexic.add(word);

これをコンストラクターで使用しています。つまり、作成中にオブジェクトを使用しています。それがNPEを取得する理由です。これを削除すると、動作します。

メソッドにも充填部分を入れると、それはつまり

Set<String> lexic = new TreeSet<String>();

も同じメソッドにあり、「this」はローカルレベル変数用ではないため、「this」も機能しません。ただし、その場合も、NPE は発生しませんが、コンパイラ エラーが発生します。

このコードは正常に動作しています。一度確認してください。

public AnagramUserInput()
{
    Set<String> result = new TreeSet<String>();
    Set<String> lexic = new TreeSet<String>();
    File lexicon = new File("output.txt");
    BufferedReader br = null;
    try{
        br = new BufferedReader(new FileReader(lexicon));
        String word;

        while(((word = br.readLine()) != null)) {
            lexic.add(word);//Exception is throwned right in this line
         }

    }catch(IOException exc) {
        System.out.println(exc.toString());
        System.exit(1);
    }

    finally
    {
       if (br != null)
       {
            try
            {
                br.close();
            }
            catch (IOException e)
            {
               // TODO Auto-generated catch block
               e.printStackTrace();
            }
       }
    }

    System.out.println(lexic);
}

ファイルが必要に応じて適切な場所にあることを確認してください。

于 2013-10-19T17:16:49.037 に答える