我正在使用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文件中读取值。