2013-04-11 3 views
0

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

Я хорошо и действительно не может проследить, где исключение из. Я прочитал, что его генерирует (многие объяснения на этом сайте), но я не могу диагностировать, что в моем фактическом коде бросает исключение.

Большое спасибо.

+2

и который линия 12? – christopher

+1

Используйте отладчик, чтобы пройти, и вы ответите на собственный вопрос. –

+0

Установите размер ваших массивов. – adchilds

ответ

1

Ваш массив WordCount[] searchWords; никогда не инициализируется.

Добавить searchWords = new WorkCount[searchWorkdsAsStrings.length]; под searchWordsAsStrings = w.split(" ");

EDIT

Чтобы ответить на ваш вопрос с комментарием ниже, 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(); 
     } 
     } 
+0

Отлично. Огромное спасибо. Моя проблема заключалась в том, что похожие строки не компилировались правильно, но я думаю (как я читал в другом месте), что не включает в себя тип в левой части задания. По какой-то причине. Вот почему я хочу, чтобы они научили нас Ruby вместо Java. – dfaulken

+0

Любопытно, что теперь я получаю исключение NoSuchElementException из строки 24, хотя он находится в состоянии (st.HasMoreTokens()). – dfaulken

+0

см. Редактировать – Kal

6

Ваша проблема связана с неправильной инициализацией массива!

WordCount[] searchWords; 

Но вы никогда не объявлять searchWords = new WordCount[dimension];

При попытке ссылки на этот массив, вы пытаетесь получить доступ то, что не существует. Потому что WordCount[] - это объект в, и сам, он бросает NullPointerException, потому что он еще не ссылается на объект WordCount[].

1

Похоже, что вы пытаетесь присвоить объекты массиву searchWords до его инициализации (если это не сделано в суперклассе). Убедитесь, что вы инициализировать массив как

WordCount[] wordArray = new WordCount[10]; 

или

WordCount[] wordArray = new WordCount[]{new WordCount()}; 
Смежные вопросы