0

我正在编写一个读取文件并对“单词”进行排序的项目。这段代码编译正确,但它给了我一个空指针异常。有任何想法吗?

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

这里有两个不同的问题:1.您的主要方法不是静态的。2. 您使用的 IDE DrJava 没有显示好的错误消息。

关于问题1,如果在words、addWord、main的声明中加上static,就可以运行你的程序了。

错误消息,问题 2,是 DrJava 的“运行”命令中的错误的结果,该命令应该能够运行 Java 程序和 Java 小程序。为了解决 2.,我在 DrJava 的 SourceForge 页面提交了一份错误报告。我们会尽快修复这个错误。

对不起给您带来不便。

于 2011-10-28T15:15:02.037 回答
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返回下一个以行尾分隔的字符串,并next从输入文件中返回下一个标记。这真的是你想要的吗?我建议试试这个:

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

    linecount++;
}

请记住,这仅在每行只有一个单词时才有效。如果你想每行处理多个单词,它会稍微长一点:

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 回答
2

你在评论中发布了这个:

java.lang.NullPointerException
 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 在 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 回答