Я пишу код для курса. Мы должны сканировать строки из файла, указанного пользователем, искать каждую строку для одного или нескольких слов, указанных пользователем, и сообщать, сколько раз во всем файле (обрабатываемом по очереди) эти слова присутствуют. Нам даны три класса, и мы хотим записать четвертый. Мой код бросает исключение NullPointerException в строке 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));
}
}
Я хорошо и действительно не может проследить, где исключение из. Я прочитал, что его генерирует (многие объяснения на этом сайте), но я не могу диагностировать, что в моем фактическом коде бросает исключение.
Большое спасибо.
и который линия 12? – christopher
Используйте отладчик, чтобы пройти, и вы ответите на собственный вопрос. –
Установите размер ваших массивов. – adchilds