NullPointerExcetion本机方法访问器...哈希单词问题

时间:2011-10-27 02:08:49

标签: java hash nullpointerexception native-methods drjava

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

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)

3 个答案:

答案 0 :(得分:3)

这个while循环很奇怪:

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

如果您的输入文件是:

a
b

然后scanner.nextLine()将返回a,然后scanner.next()将返回b,因为nextLine返回下一个以行尾分隔的字符串,并next 1}}从输入文件返回下一个标记。这真的是你想要的吗?我建议试试这个:

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++;
}

答案 1 :(得分:3)

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

对于问题1,如果在单词声明,addWord和main中添加静态,则可以运行程序。

错误的错误消息,问题2,是DrJava的“运行”命令中的错误的结果,该命令应该能够运行Java程序和Java小程序。为了解决2.,我在DrJava的SourceForge页面上提交了bug report。我们很快就会解决这个问题。

对于给您带来的不便,我很抱歉。

答案 2 :(得分:2)

您在评论中发布了此内容:

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)

看起来您使用的是非标准Java编译器。尝试使用Sun或IBM的javac进行编译,看看它是否为您提供了不同的跟踪。如果确实如此,那么你的大学实施javac可能只是一个错误。

我提到这一点,因为JavacCompiler类的使用对于代码的运行时执行是可疑的。