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" 指向哪里,应用程序在哪里启动。
我写了一些代码来打开和读取 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" 指向哪里,应用程序在哪里启动。