在IntelliJ JavaFX Gradle项目中加载资源时出现NullPointerException



我正在使用IntelliJ和Gradle开发/学习JavaFX程序。作为它的一部分,我试图加载一个JSON文件,但我一直得到一个NullPointerException。

如果我理解正确,IntelliJ标记src->main->java作为java源根,并且src->main->资源作为资源的根。代码进入java,其他文件进入资源。因此,我将JSON文件放在资源文件中,并将那里的目录结构与类试图加载资源的包结构相匹配。项目结构如下:

C:.
├───main
│   ├───java
│   │   └───com
│   │       └───gmail
│   │           └───jakesaddress
│   │               └───jgametest
│   │                   ├───map
│   │                   └───ui
│   └───resources
│       └───com
│           └───gmail
│               └───jakesaddress
│                   └───jgametest
│                       └───map
└───test
├───java
└───resources

我用来尝试和加载文件的代码是(我已经尝试了两种,结果相同(:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("map.json");
-- or --
InputStream inputStream = getClass().getClassLoader().getResourceAsStream("/com/gmail/jakesaddress/jgametest/map/map.json");

我加载它的类是:

com.gmail.jakesaddress.jgametest.map.Map

从我目前所读到的内容来看,我相信我还需要另外两个配置。在IntelliJ中,我需要将JSON添加到";资源模式";文件中的列表->设置->生成、执行、部署->编译器,它现在读起来是这样的:

!?*.java;!?*.form;!?*.class;!?*.groovy;!?*.scala;!?*.flex;!?*.kt;!?*.clj;!?*.aj;?*.json

我是通过Gradle应用程序运行任务运行的,如果我理解正确的话,Gradle也可能与IntelliJ不同地定义资源,所以我在构建中需要以下内容。Gradle:

sourceSets {
main {
java {
srcDir 'src/main/java'
}
resources {
srcDir 'src/main/resources'
}
}
}

我不知道为什么这不起作用,也不知道下一步该怎么办。有人能帮我解释一下吗?

重读getResourceAsStream的文档让我尝试了完整的路径,但没有前导的"&";,像这样:

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("com/gmail/jakesaddress/jgametest/map/map.json");

这似乎奏效了;它现在正在从json文件中读取值。

最新更新