将字符串添加到TreeSet <string> </string>的NullPointerException

时间:2013-10-19 17:13:38

标签: java nullpointerexception set bufferedreader treeset

我的问题是我在这段代码中找不到错误。我想在构造函数中填充我的程序字段(字符串集),并从文件中获取字符串。

`

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 个答案:

答案 0 :(得分:2)

this.lexic评估为null。请注意,this.lexis并未指向构造函数的本地lexic变量,而是指向实例的变量。

如果你想将String添加到构造函数的lexic变量中,只需删除this关键字:

lexic.add(word);

答案 1 :(得分:1)

您很可能将另一个名为lexic的变量作为类实例变量。 (如果不是这种情况,上面的代码将无法编译)

因此,您可能会隐藏result变量。取代

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

lexic = new TreeSet<String>();

答案 2 :(得分:1)

我在这里看到的唯一问题是

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

删除this。因为构造函数实例化了类。甚至在创建对象之前,您就试着使用this,这是错误的。

答案 3 :(得分:0)

this.lexic.add(word);

您正在构造函数中使用它,这意味着您在创建对象时正在使用该对象。这就是你获得NPE的原因。删除它,它会工作。

如果你也把填充部分放在方法中,那就意味着

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

也是同样的方法,然后&#34;这个&#34;不会起作用,因为&#34;这个&#34;不适用于本地级变量。但在这种情况下,它也不会给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);
}

确保文件位于正确的位置。