0

ファイルを読み取って「単語」を並べ替えるプロジェクトを書いています。このコードは正しくコンパイルされますが、nullポインター例外が発生します。何か案は?

import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
import java.util.Hashtable;

public class Lab {
   Hashtable<String, Word> words = new Hashtable<String, Word>();

   public void addWord(String s, int i) {
      if (words.containsKey(s)) {
         words.get(s).addOne();
         words.get(s).addLine(i);
      } else {
         words.put(s, new Word(s));
         words.get(s).addLine(i);
      }
   }

   public void main(String[] args) {
      System.out.println("HI");
      File file = new File("s.txt");
      int linecount = 1;
      try {
         Scanner scanner = new Scanner(file);
         System.out.println("HUH");

         while (scanner.hasNextLine()) {
            String line = scanner.nextLine();
            while (line != null) {
               String word = scanner.next();
               addWord(word, linecount);
            }
            linecount++;

         }
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      }
   }
}

例外のスタックトレースは次のとおりです。

java.lang.NullPointerException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌​1)
4

3 に答える 3

3

このwhileループは奇妙です:

while (scanner.hasNextLine()) {
    String line = scanner.nextLine();
    while (line != null) {
       String word = scanner.next();
       addWord(word, linecount);
    }
    linecount++;
}

入力ファイルが次の場合:

a
b

次にscanner.nextLine()returnになりa、次にscanner.next()returnになりますb。これnextLineは、次の終了行で区切られたStringをnext返し、入力ファイルから次のトークンを返すためです。これは本当にあなたが望むものですか?私はこれを試すことをお勧めします:

while (scanner.hasNextLine()) {{
    String word = scanner.nextLine();
    addWord(word, linecount);

    linecount++;
}

これは、1行に単語しかない場合にのみ機能することに注意してください。1行に複数の単語を処理する場合は、少し長くなります。

while (scanner.hasNextLine()) {{
    String line = scanner.nextLine();

    Scanner lineScanner = new Scanner(line);
    while(lineScanner.hasNext()) {
        addWord(lineScanner.next(), linecount);
    }

    linecount++;
}
于 2011-10-27T03:00:10.220 に答える
3

ここには2つの異なる問題があります。1。メインメソッドが静的ではありません。2.使用しているIDEであるDrJavaは、適切なエラーメッセージを表示していません。

問題1に関しては、words、addWord、mainの宣言にstaticを追加すると、プログラムを実行できるようになります。

悪いエラーメッセージである問題2は、JavaプログラムとJavaアプレットの両方を実行できるはずのDrJavaの「run」コマンドのバグの結果です。2.に対処するために、DrJavaのSourceForgeページにバグレポートを提出しました。そのバグはすぐに修正されます。

ご不便をおかけして申し訳ございません。

于 2011-10-28T15:15:02.037 に答える
2

あなたはコメントでこれを投稿しました:

java.lang.NullPointerException
 sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)で
 sun.reflect.NativeMethodAccessorImpl.invoke(不明なソース)で
 sun.reflect.DelegatingMethodAccessorImpl.invoke(不明なソース)で
 java.lang.reflect.Method.invoke(不明なソース)で
 edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:27‌ 1)で

非標準のJavaコンパイラを使用しているようです。これをSunまたはIBMのjavacでコンパイルして、別のトレースが得られるかどうかを確認してください。もしそうなら、それはあなたの大学のjavacの実装のエラーかもしれません。

JavacCompilerクラスの使用はコードの実行時の実行に疑わしいため、これについて言及します。

于 2011-10-27T02:35:11.980 に答える