2

一連の単語をトークンに分割してテキストを読み取り、その頻度をカウントするプログラムを作成しています。このコードにはいくつかの関連コード (WordCount、FreqStudy、および Echo) がありますが、WordFreq クラスが java.lang.NullPointerException エラーの原因となっています。WordFreq のコードは次のとおりです。

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 の結果を返します。誰か助けて?

4

2 に答える 2

6

値を割り当てる前に配列を初期化しwcArrayます。

wcArray = new WordCount[wordString.length];
于 2013-04-16T23:24:08.980 に答える
4

スタック トレースを注意深く調べる必要があります。

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

WordFreq.java:17WordFreq クラス ( ) のコンストラクターにあるWordFreq ( ) の 17 行目あたり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]null で NPE が発生する可能性があると考える人もいるかもしれませんが、それは割り当てのターゲットであるため、NPE は発生しませんnull。値は着信割り当てで上書きされます。

同様に、wordString[i]null が原因で NPE が発生する可能性があると考える人もいるかもしれませんが、これにより anullがメソッドに渡されることになりますが、これは問題ありません。WordCount コンストラクターnullに渡される に問題がある場合、スタックトレースにはWordCountエントリの上にat WordFreq.<init>エントリが含まれます。

于 2013-04-16T23:39:14.573 に答える