InputStreamReader 在通过 cmd 启动时抛出 NullPointerException

InputStreamReader throws NullPointerException when launching via cmd

我写了一些代码来打开和读取 csv 文件的内容:

 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(this.getClass().getResourceAsStream(fileName)));
 String line;

 try {
     line = bufferedReader.readLine();

     while (line != null) {
         line = bufferedReader.readLine();
     }
 } catch (IOException e) {
     e.printStackTrace();
 } finally {
     // close buffered reader
 }

代码在单元测试中运行良好,未引发异常。但是,一旦我尝试通过 cmd 启动程序,它就会抛出一个来自 InputStreamReader 的 NPE:

Exception in thread "main" java.lang.NullPointerException
    at exercise.FileLoader.loader(FileLoader.java:28)
    at exercise.Application.main(Application.java:22)

程序实际以文件名为参数:

 public static void main(String[] args) {
    if (args.length > 1) {
        System.out.println("Too many input arguments.");
        System.exit(-1);
    }

    String fileName = args[0];
    //here runs the method who reads the csv file above
 }

你能告诉我发生了什么事吗?

我认为您的问题与您通过 cmd 启动程序后无法找到文件有关。 您是否尝试过将程序放在文件的同一文件夹中?您还可以要求用户在 main 中输入,以便您可以提供正确的文件夹。

以下读取不是文件系统上的文件,而是资源上的资源 class 路径(主要是只读的)。

BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(getClass().getResourceAsStream(fileName)));

此外,编码是当前平台的编码,在另一台 PC 上可能会有所不同。 而且我没有看到 close() 可能在准备问题时被删除了。

对于文件系统:

Path path = Paths.get(filename);
try (BufferedReader bufferedReader =
             Files.newBufferedReader(path, Charset.defaultCharset())) {
     line = ...
     ...
} // Automatic close.

当路径不是绝对路径时,必须要小心。然后它取决于 "working directory" 指向哪里,应用程序在哪里启动。