所以这是我的程序,它工作正常:
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.Locale;
public class ScanSum {
public static void main(String[] args) throws IOException {
Scanner s = null;
double sum = 0;
try {
s = new Scanner(new BufferedReader(new FileReader("D:/java-projects/HelloWorld/bin/usnumbers.txt")));
s.useLocale(Locale.US);
while (s.hasNext()) {
if (s.hasNextDouble()) {
sum += s.nextDouble();
} else {
s.next();
}
}
} finally {
s.close();
}
System.out.println(sum);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我正在使用我正在阅读的文件的绝对路径:
s = new Scanner(new BufferedReader(new FileReader("D:/java-projects/HelloWorld/bin/usnumbers.txt")));
Run Code Online (Sandbox Code Playgroud)
当我尝试使用相对路径时出现问题:
s = new Scanner(new BufferedReader(new FileReader("usnumbers.txt")));
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Exception in thread "main" java.lang.NullPointerException
at ScanSum.main(ScanSum.java:24)
Run Code Online (Sandbox Code Playgroud)
文件usnumbers.txt与ScanSum.class文件位于同一目录中:
D:/java-projects/HelloWorld/bin/ScanSum.class
D:/java-projects/HelloWorld/bin/usnumbers.txt
Run Code Online (Sandbox Code Playgroud)
我该怎么解决这个问题?
pdb*_*ett 26
如果aioobe @的建议对您不起作用,并且您需要找出应用程序运行的目录,请尝试记录以下内容:
new File(".").getAbsolutePath()
Run Code Online (Sandbox Code Playgroud)
aio*_*obe 14
从哪个目录执行的类文件?(这将是相对路径的当前工作目录和基目录.)
如果您只是从eclipse启动应用程序,项目目录将是工作目录,在这种情况下您应该使用"bin/usnumbers.txt".
这NullPointerException是因为new FileReader()表达式抛出a FileNotFoundException,并且变量s永远不会重新赋值为非null值.
找不到文件"usnumbers.txt",因为相对路径已解析(与所有程序一样)相对于当前工作目录,而不是类路径上的众多条目之一.
要解决第一个问题,请永远不要分配无意义的null值,只是为了隐藏编译器有关未分配变量的警告.使用这样的模式:
FileReader r = new FileReader(path);
try {
Scanner s = new Scanner(new BufferedReader(r));
...
} finally {
r.close();
}
Run Code Online (Sandbox Code Playgroud)
对于第二个问题,在启动之前将目录更改为包含"usnumbers.txt"的目录java.或者,将该文件移动到java运行的目录.