如何解决使用InputStream存储资源路径的空指针异常?
How to resolve Null pointer exception using InputStream to store resource path?
我正在尝试在 Windows、game.json
上的 Eclipse 项目中设置资源文件的文件路径,但是当我尝试从 InputStream 创建输入流字符串时,我得到了一个NullPointerException.
为了调试它,我检查了我的资源的正确文件路径,看起来确实如此。我还为错误设置了一个断点,它似乎发生在这一行:
String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\A").next();
有谁知道为什么使用给定路径找不到 JSON 文件?
这些是我为引用资源的文件路径而采取的步骤,但我遇到了 NPE:
private static final String GAME_FILE = "/game.json";
//I've also tried the path, "resources/game.json" but got the same error..
InputStream source = getClass().getClassLoader().getResourceAsStream(GAME_FILE);
String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\A").next();
ObjectMapper mapper = new ObjectMapper();
// read from file, convert it to Location class
Location loc = mapper.readValue(new File(inputStreamString), Location.class);
这是我的项目树的结构:
这是抛出的错误:
Exception in thread "main" java.lang.NullPointerException: source
at java.util.Objects.requireNonNull(Unknown Source)
at java.util.Scanner.<init>(Unknown Source)
at gmit.GameParser.parse(GameParser.java:23)
at gmit.Main.main(Main.java:13)
您可能正在尝试读取资源文件 game.json
的 JSON 内容并使用 ObjectMapper
解析 JSON 并将其反序列化为 Location
对象。
Location loc = mapper.readValue(new File(inputStreamString), Location.class);
ObjectMapper
已经有一个接受 InputStream
的 readValue
方法。您不需要使用 File
.
所以你可以拥有
InputStream source = getClass().getResourceAsStream(GAME_FILE);
Location loc = mapper.readValue(source, Location.class);
请注意,类路径资源不一定可以通过 File
实例访问,因为它不一定代表文件系统实体。
您的资源 game.json
在包 resources
中。像这样检索它
private static final String GAME_FILE = "/resources/game.json";
(假设包 resources
在您的运行时类路径中。)
同时删除 getClassLoader
调用
InputStream source = getClass().getClassLoader().getResourceAsStream(GAME_FILE);
尝试使用绝对路径:/resources/game.json
将行拆分 String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\A").next();
。您必须确定是否实例化 Scanner 导致异常是因为 InputStream 为空(由于未找到资源)还是 .next()
导致异常。
分割线:
Scanner s = new Scanner(source,"UTF-8").useDelimiter("\A");
String output = s.next();
然后判断这两行中哪一行抛出异常
资源 game.json
需要是类路径资源,因为项目正在导出到 jar 文件。
我用来转换下面的输入流的代码实际上是将 文件 转换为一个字符串,这不是我得到的:
String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\A").next();
我需要做的是将类路径资源转换为 URI,然后在 File 的构造函数中调用 .toURI(),而不是像这样:
URL sourceURL = getClass().getResource(GAME_FILE);
ObjectMapper mapper = new ObjectMapper();
Location loc = mapper.readValue(new File(sourceURL.toURI()), Location.class);
我正在尝试在 Windows、game.json
上的 Eclipse 项目中设置资源文件的文件路径,但是当我尝试从 InputStream 创建输入流字符串时,我得到了一个NullPointerException.
为了调试它,我检查了我的资源的正确文件路径,看起来确实如此。我还为错误设置了一个断点,它似乎发生在这一行:
String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\A").next();
有谁知道为什么使用给定路径找不到 JSON 文件?
这些是我为引用资源的文件路径而采取的步骤,但我遇到了 NPE:
private static final String GAME_FILE = "/game.json";
//I've also tried the path, "resources/game.json" but got the same error..
InputStream source = getClass().getClassLoader().getResourceAsStream(GAME_FILE);
String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\A").next();
ObjectMapper mapper = new ObjectMapper();
// read from file, convert it to Location class
Location loc = mapper.readValue(new File(inputStreamString), Location.class);
这是我的项目树的结构:
这是抛出的错误:
Exception in thread "main" java.lang.NullPointerException: source
at java.util.Objects.requireNonNull(Unknown Source)
at java.util.Scanner.<init>(Unknown Source)
at gmit.GameParser.parse(GameParser.java:23)
at gmit.Main.main(Main.java:13)
您可能正在尝试读取资源文件 game.json
的 JSON 内容并使用 ObjectMapper
解析 JSON 并将其反序列化为 Location
对象。
Location loc = mapper.readValue(new File(inputStreamString), Location.class);
ObjectMapper
已经有一个接受 InputStream
的 readValue
方法。您不需要使用 File
.
所以你可以拥有
InputStream source = getClass().getResourceAsStream(GAME_FILE);
Location loc = mapper.readValue(source, Location.class);
请注意,类路径资源不一定可以通过 File
实例访问,因为它不一定代表文件系统实体。
您的资源 game.json
在包 resources
中。像这样检索它
private static final String GAME_FILE = "/resources/game.json";
(假设包 resources
在您的运行时类路径中。)
同时删除 getClassLoader
调用
InputStream source = getClass().getClassLoader().getResourceAsStream(GAME_FILE);
尝试使用绝对路径:/resources/game.json
将行拆分 String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\A").next();
。您必须确定是否实例化 Scanner 导致异常是因为 InputStream 为空(由于未找到资源)还是 .next()
导致异常。
分割线:
Scanner s = new Scanner(source,"UTF-8").useDelimiter("\A");
String output = s.next();
然后判断这两行中哪一行抛出异常
资源 game.json
需要是类路径资源,因为项目正在导出到 jar 文件。
我用来转换下面的输入流的代码实际上是将 文件 转换为一个字符串,这不是我得到的:
String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\A").next();
我需要做的是将类路径资源转换为 URI,然后在 File 的构造函数中调用 .toURI(),而不是像这样:
URL sourceURL = getClass().getResource(GAME_FILE);
ObjectMapper mapper = new ObjectMapper();
Location loc = mapper.readValue(new File(sourceURL.toURI()), Location.class);