我正在为课程编写代码。我们旨在扫描用户指定文件中的行,在每行中搜索用户指定的一个或多个单词,并报告这些单词在整个文件中存在多少次(逐行处理)。我们给了三课,打算写第四课。我的代码在第12行上抛出了NullPointerException,我不确定为什么。据我所知,我已经声明并初始化了该行中涉及的变量。我的代码是:
import java.io.IOException;
import java.util.*;
public class WordFreq extends Echo{
String[] searchWordsAsStrings;
WordCount[] searchWords;
public WordFreq(String f, String w) throws IOException{
super(f);
searchWordsAsStrings = w.split(" ");
for(int a = 0; a < searchWordsAsStrings.length; a++){
searchWords[a] = new WordCount("");
}
for(int a = 0; a < searchWordsAsStrings.length; a++){
searchWords[a].setWord(searchWordsAsStrings[a]);
}
}
public void processLine(String line){
StringTokenizer st = new StringTokenizer(line);
while(st.hasMoreTokens()){
for(int a = 0; a < searchWords.length; a++){
if(searchWords[a].getWord() == st.nextToken()){
searchWords[a].incCount();
}
}
}
}
public void reportFrequencies(){
System.out.println("Word counts:");
for(int a = 0; a < searchWords.length; a++){
System.out.println(searchWords[a].toString());
}
}
}
堆栈跟踪:
java.lang.NullPointerException
at WordFreq.<init>(WordFreq.java:12)
at FreqStudy.main(FreqStudy.java:20)
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)
该应用程序的主要类别如下。我已注释掉给定的代码并提供了自己的代码,以尝试诊断问题。
import java.util.*;
import java.io.*;
public class FreqStudy{
public static void main(String[] args) throws IOException
{
/*
Scanner scan = new Scanner(System.in);
System.out.println("enter file name");
String fileName = scan.next();
*/
String fileName = "pg37997.txt";
/*
Scanner scan2 = new Scanner(System.in);
System.out.println("enter words to search for");
System.out.println("enter lower case, separated by spaces");
String wordString = scan2.nextLine();
*/
String wordString = "cow horse chicken goat pig";
WordFreq f = new WordFreq(fileName,wordString);
f.readLines();
f.reportFrequencies();
}
}
此应用程序还使用下面提供的Echo和WordCount类:
import java.util.Scanner;
import java.io.*;
public class Echo{
String fileName; // external file name
Scanner scan; // Scanner object for reading from external file
public Echo(String f) throws IOException
{
fileName = f;
scan = new Scanner(new FileReader(fileName));
}
public void readLines(){ // reads lines, hands each to processLine
while(scan.hasNext()){
processLine(scan.nextLine());
}
scan.close();
}
public void processLine(String line){ // does the real processing work
System.out.println(line);
}
}
public class WordCount{
private String word;
private int count;
public WordCount(String w){
word = w;
count = 0;
}
public String getWord(){
return word;}
public void setWord(String w){
word = w;
}
public int getCount(){
return count;}
public void incCount(){count++;}
public String toString() {
return(word + " --- " + count);
}
public boolean equals(Object other){
WordCount i = (WordCount)other;
return (this.word.equals(i.word));
}
}
我完全无法追踪异常的来源。我已经阅读了生成它的原因(此站点上有很多解释),但是我无法诊断实际代码中的异常。
非常感谢。
最佳答案
您的WordCount[] searchWords;
数组永远不会初始化。
在searchWords = new WorkCount[searchWorkdsAsStrings.length];
下添加searchWordsAsStrings = w.split(" ");
编辑
为了从下面的评论中回答您的问题,st.nextToken()推进了令牌,这就是抛出NoSuchElementException的原因。与其在for循环中执行此操作,不如将st.nextToken()读入变量,然后进行==比较。
while(st.hasMoreTokens()){
String s = st.nextToken();
for(int a = 0; a < searchWords.length; a++){
if(searchWords[a].getWord().equals(s)){
searchWords[a].incCount();
}
}