【问题标题】:InputStreamReader throws NullPointerException when launching via cmdInputStreamReader 通过 cmd 启动时抛出 NullPointerException
【发布时间】:2018-07-19 07:52:24
【问题描述】:

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

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

【问题讨论】:

    标签: java cmd nullpointerexception inputstream bufferedreader


    【解决方案1】:

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

    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.
    

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 如果您需要用户输入,请尝试给出文件的绝对路径(C:\path\etc..)
      • 我都尝试了(将文件放在与 exe 相同的文件夹下,然后简单地给出 csv 文件名作为参数并给出完整路径)。是的,主要是我要求用户提供它如何窃听的文件名。现在将编辑问题描述。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 2012-09-26
      • 2015-07-10
      • 2013-01-03
      • 1970-01-01
      相关资源
      最近更新 更多