我正在编写一个程序,它将一系列单词分成标记并读取文本,然后计算它们的频率。此代码有几个相关代码(WordCount,FreqStudy和Echo),但WordFreq类是导致java.lang.NullPointerException错误的原因。这是我的WordFreq代码:
import java.util.*;
import java.io.*;
public class WordFreq extends Echo{
WordCount[] wcArray;
int ct;
String[] sentence;
double freq;
String newLine;
public WordFreq(String f, String words) throws IOException{
super(f);
String[] wordString = words.split(" ");
for(int i=0; i<wordString.length; i++)
wcArray[i] = new WordCount(wordString[i]);
Scanner scan = new Scanner(new FileReader(fileName));
}
public void processLine(String line){
newLine = line.toLowerCase();
sentence = newLine.split(" ");
for(String s: sentence){
for(WordCount w: wcArray){
if(w.getWord().equals(s))
w.incCount();
}
ct++;
}
}
public void reportFrequencies(){
for (int i=0; i<wcArray.length; i++){
freq = (wcArray[i].getCount() / ct);
System.out.print(wcArray[i].getWord()+" ");
System.out.printf("%6.4f\n", freq);
}
}
}
当我给它一个文件来阅读FreqStudy主类时,我收到的错误看起来像这样:
java.lang.NullPointerException
at WordFreq.<init>(WordFreq.java:17)
at FreqStudy.main(FreqStudy.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
我真的不明白这个问题是什么,我整天都在努力,所以我觉得脑子已经死了。如果可以,请看看,我真的很感激。
编辑:我意识到在发布此内容后我没有对其进行初始化,但我的频率返回0结果。有人帮忙吗?答案 0 :(得分:5)
在分配任何值之前初始化数组wcArray
:
wcArray = new WordCount[wordString.length];
答案 1 :(得分:4)
您需要仔细检查堆栈跟踪:
java.lang.NullPointerException
at WordFreq.<init>(WordFreq.java:17)
WordFreq(WordFreq.java:17
)的第17行,它位于WordFreq类(WordFreq.<init>
)的构造函数中,当它null
时会被使用或取消引用。
wcArray[i] = new WordCount(wordString[i]);
可能的候选人:wcArray
和wordString
。现在确保初始化了这些对象/数组。 wordString
通过split()
的返回值执行,但wcArray
没有。需要分配数组(wcArray
)或分配给预先存在的数组(wordString
):
String[] wordString = words.split(" ");
wcArray = new String[wordString.length]
for(int i=0; i<wordString.length; i++)
wcArray[i] = new WordCount(wordString[i]);
进一步的考虑:有人可能认为wcArray[i]
可能为空并导致NPE,但由于它是赋值的目标,因此不会导致NPE - null
值将被覆盖传入的作业。
同样,有人可能认为wordString[i]
可能为null并导致NPE,但这会导致null
传递给方法,这很好。如果WordCount构造函数传递给null
有问题,那么堆栈跟踪将在WordCount
条目上方包含at WordFreq.<init>
条目。