2013-04-16 5 views
2

Я пишу программу, которая выделяет ряд слов, разделенных на токены, и читает текст, а затем подсчитывает их частоты. Этот код имеет несколько связанных кодов (WordCount, FreqStudy и Echo), но класс WordFreq вызывает ошибку java.lang.NullPointerException. Вот мой код WordFreq:java.lang.NullPointerException, не могу понять почему?

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) 

Я действительно не понимаю, что проблема в том, и я работал над этим весь день, поэтому я чувствую себя мертвым. Пожалуйста, посмотрите, можете ли вы, я бы очень признателен.

EDIT: Я понял, что я не инициализировал его сразу после публикации, но мои частоты возвращают 0 результатов. Кто-нибудь поможет?

+0

Это возвращает 0, а также возвращает счетчик 0. –

+0

Инициируйте double ct = 0.0 или 1.0 и отлаживайте свой код, почему getCount возвращает 0. – Smit

+0

@EmmaHyde Если отладка не работает, создайте другое сообщение, включая класс 'WordCount' и как вызывается методы в WordFreq. – Reimeus

ответ

5

Инициализировать массив wcArray до присвоения каких-либо значений:

wcArray = new WordCount[wordString.length]; 
4

Вам необходимо внимательно изучить StackTrace:

java.lang.NullPointerException 
    at WordFreq.<init>(WordFreq.java:17) 

вокруг линии 17 WordFreq (WordFreq.java: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] может быть нулевым и вызвать NPE, но это может привести к передаче null методу, что хорошо. Если у конструктора WordCount возникла проблема с переданным ему null, тогда стек будет включать запись WordCount над записью at WordFreq.<init>.

+0

Здравствуйте, у меня другая проблема. Все мои частоты возвращаются как 0. У вас есть идея, почему это может произойти? –

Смежные вопросы