如何解决使用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 已经有一个接受 InputStreamreadValue 方法。您不需要使用 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);