相对文件路径问题

所以这是我的程序,它运行正常:

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

如您所见,我正在使用我正在阅读的文件的绝对路径:

 s = new Scanner(new BufferedReader(new FileReader("D:/java-projects/HelloWorld/bin/usnumbers.txt"))); 

当我尝试使用相对路径时出现问题:

 s = new Scanner(new BufferedReader(new FileReader("usnumbers.txt"))); 

我收到一个错误:

 Exception in thread "main" java.lang.NullPointerException at ScanSum.main(ScanSum.java:24) 

文件usnumbers.txt与ScanSum.class文件位于同一目录中:

 D:/java-projects/HelloWorld/bin/ScanSum.class D:/java-projects/HelloWorld/bin/usnumbers.txt 

我该怎么解决这个问题?

从哪个目录执行类文件? (这将是相对路径的当前工作目录和基目录。)

如果你只是从eclipse启动应用程序,项目目录将是工作目录,在这种情况下你应该使用"bin/usnumbers.txt"

如果aioobe @的建议对您不起作用,并且您需要找出应用程序运行的目录,请尝试记录以下内容:

 new File(".").getAbsolutePath() 

NullPointerException是由于new FileReader()表达式抛出FileNotFoundException ,并且变量s永远不会重新赋值为非null值。

找不到文件“usnumbers.txt”,因为相对路径已解析(与所有程序一样)相对于当前工作目录,而不是类路径上的众多条目之一。

要解决第一个问题,请永远不要分配无意义的null值,只是为了隐藏编译器有关未分配变量的警告。 使用这样的模式:

 FileReader r = new FileReader(path); try { Scanner s = new Scanner(new BufferedReader(r)); ... } finally { r.close(); } 

对于第二个问题,在启动java之前将目录更改为包含“usnumbers.txt”的目录。 或者,将该文件移动到运行java的目录。

它必须是FileNotFoundException,导致finally块中的NPE。 默认情况下,Eclipse使用项目文件夹(在您的情况下为D:/ java-projects / HelloWorld )作为工作目录来执行该类。 将usnumbers.txt文件放在该文件夹中并尝试。 或者在“运行配置” – >“参数”选项卡中更改工作目录

由于您的工作目录是“D:/ java-projects / HelloWorld”

@pdbartlett的id很棒,但是String filePath = new File(".").getAbsolutePath()将输出“D:/ java-projects / HelloWorld /”。 这是不容易添加你的额外相对路径,如位于资源文件夹中的“filePath”+“/ src / main / resources /”+ FILENAME。

我建议使用String filePath = new File("").getAbsolutePath()返回项目根文件夹

在Eclipse中,您还可以在“运行配置 – >比TAB”类路径下查看“。

默认情况下,绝对路径列在[ icon ]’ your.path ‘中的“用户条目”下(默认类路径)