如何使用InputStream来存储资源路径来解决Null指针异常?

时间:2015-03-30 18:32:33

标签: java resources jackson inputstream filepath

我正在尝试在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);

这是我项目树的结构:

project tree

抛出错误:

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)

3 个答案:

答案 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);