我正在尝试在Windows上的Eclipse项目game.json
中设置资源文件的文件路径,但是当我尝试从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)
答案 0 :(得分:1)
您可能正在尝试读取资源文件game.json
的JSON内容,并使用ObjectMapper
来解析该JSON并将其反序列化为Location
对象。
Location loc = mapper.readValue(new File(inputStreamString), Location.class);
ObjectMapper
已经有readValue
方法接受InputStream
。您不需要使用带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);
答案 1 :(得分:1)
尝试使用绝对路径:/resources/game.json
分开String inputStreamString = new Scanner(source,"UTF-8").useDelimiter("\\A").next();
行。您必须确定实例化Scanner是否导致异常,因为InputStream为null(由于找不到资源)或.next()
是否导致异常。
分手:
Scanner s = new Scanner(source,"UTF-8").useDelimiter("\\A");
String output = s.next();
然后确定这两行中的哪一行抛出异常。
答案 2 :(得分:0)
资源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);