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);

您在构造函数中使用 this ,这意味着您在创建对象期间使用该对象。这就是您获得 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 回答