通过cmd启动时InputStreamReader引发NullPointerException

时间:2018-07-19 07:52:24

标签: java cmd nullpointerexception inputstream bufferedreader

我写了一些代码来打开和读取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
 }

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

以下内容在文件系统上读取不是文件,但在类路径上读取资源(原则上是只读的。

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.

当路径不是绝对路径时,必须格外小心。然后取决于“工作目录”指向的位置以及应用程序的启动位置。