我正在为课程编写代码。我们旨在扫描用户指定文件中的行,在每行中搜索用户指定的一个或多个单词,并报告这些单词在整个文件中存在多少次(逐行处理)。我们给了三课,打算写第四课。我的代码在第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();
        }
      }

08-28 18:15