2013-04-16 220 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) 

我真的不明白是什麼問題是,我一整天都在爲此工作,所以我感覺腦死亡。請看看,如果可以的話,我會很感激。

編輯:我意識到我沒有初始化發佈後,但我的頻率返回0結果。任何人幫助?

+0

它返回0,並獲得計數返回0,以及 –

+0

啓動雙克拉= 0.0或1.0和調試代碼爲什麼getCount將返回0。 – Smit

+0

@EmmaHyde如果調試不工作,創建另一個職位包括'WordCount'類以及如何調用'WordFreq'中的方法。 – Reimeus

回答

5

陣列初始化分配的任何值wcArray之前:

wcArray = new WordCount[wordString.length]; 
4

你需要仔細檢查堆棧跟蹤:

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

圍繞WordFreq(WordFreq.java:17),這是在一個構造的線17的WordFreq類(WordFreq.<init>),正在使用或取消引用,而它是null

wcArray[i] = new WordCount(wordString[i]); 

可能的候選人:wcArraywordString。現在確保這些對象/數組已經初始化。 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時出現問題,那麼堆棧跟蹤將包含位於at WordFreq.<init>條目上方的WordCount條目。

+0

你好,我現在有一個不同的問題。我所有的頻率都返回爲0.你知道爲什麼會發生這種情況嗎? –

相關問題