【问题标题】:NPE when loading resource from directory outside of classpath从类路径之外的目录加载资源时的 NPE
【发布时间】:2013-09-27 11:11:47
【问题描述】:

我正在使用 JavaFX 并尝试将 CSS 文件加载到我的场景中。

scene.getStyleSheets().add(Main.class.getResource("res/application.css").toExternalForm();

抛出一个 NPE。我认为这是因为 css 文件不在类路径中,但我不确定如何以这种方式加载它。我不想将 css 文件包含在我的包目录 (com.somecompany.package) 中,我宁愿将它包含在可以自行部署的单独目录中(以便用户可以根据需要进行修改)。

如何从类路径外部加载 css 文件(或相关资源)?

我的堆栈跟踪:

java.lang.NullPointerException
        at com.somecompany.someapp.Main.start(Main.java:30)
        at com.sun.javafx.application.LauncherImpl$5.run(LauncherImpl.java:319)
        at com.sun.javafx.application.PlatformImpl$5.run(PlatformImpl.java:206)
        at com.sun.javafx.application.PlatformImpl$4.run(PlatformImpl.java:173)
        at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
        at com.sun.glass.ui.win.WinApplication.access$100(WinApplication.java:29)
        at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:73)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 如果找不到文件那么应该抛出 FileNotFoundException... 你能粘贴 NPE 的堆栈跟踪吗?
  • @GV Class#getResource() 如果找不到资源,则返回 null
  • 添加了堆栈跟踪。 Main.class 的第 30 行是上面的行。 @SotiriosDelimanolis 是对的,它是一个 npe,因为它找不到它。我不确定如何让它找到它

标签: java css javafx classpath


【解决方案1】:

您可以在String 参数的开头添加/ 以搜索类路径根目录下的资源

scene.getStyleSheets().add(Main.class.getResource("/res/application.css").toExternalForm();

否则路径是相对于Main所在的包解析的。解析资源的规则是explained in the javadoc

如果您想实际修改文件,这并不理想。在这种情况下,您应该从文件系统中获取文件。

Path path = Paths.get("/path/to/file");     
scene.getStyleSheets().add(path.toUri().toURL()).toExternalForm();

【讨论】:

  • 如果我打算使其用户可编辑(与示例 2 相比),您能否详细说明为什么直接加载不理想(示例 1)?
  • @SnakeDoc 首先,您无法从URL 中获取OutputStream(您可以获取路径并使用FilePath,但是嗯)。其次,如果您从 jar 运行应用程序会发生什么?
  • 嗯,有趣的点。我确实计划将程序打包在一个 jar 中。我会给你的第二个例子试试
  • @SnakeDoc 在第二个示例中,该文件不应该在jar 中。
  • 对了,res目录会在jar之外,jar只包含class文件,res包含css和图片等。我觉得这样还能用吗?
猜你喜欢
  • 2011-04-22
  • 2011-03-27
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2010-12-29
  • 1970-01-01
相关资源
最近更新 更多