我正在编写一个读取文件并对“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:271)
答案 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:271)
看起来您使用的是非标准Java编译器。尝试使用Sun或IBM的javac进行编译,看看它是否为您提供了不同的跟踪。如果确实如此,那么你的大学实施javac可能只是一个错误。
我提到这一点,因为JavacCompiler
类的使用对于代码的运行时执行是可疑的。