我的问题是我在这段代码中找不到错误。我想在构造函数中填充我的程序字段(字符串集),并从文件中获取字符串。
`
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);
}
}`
你能告诉我有什么问题吗?如何解决? 非常感谢。
答案 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);
}
确保文件位于正确的位置。