【问题标题】:NullPointerException with getResource() while adding CSS to JavaFX application将 CSS 添加到 JavaFX 应用程序时出现带有 getResource() 的 NullPointerException
【发布时间】:2019-01-10 14:12:59
【问题描述】:

对我得到的 NullPointerException 有点困惑。我正在尝试将 .css 文件添加到我的 Main 类。这是代码。

        //Load FXML file
        Parent root = FXMLLoader.load(getClass().getResource("/application/HumansightFirstDraft.fxml"));

        // Create scene
        Scene scene = new Scene(root, 400, 600);

        //Load CSS
        scene.getStylesheets().add(getClass().getClassLoader().getResource("/application/application.css").toExternalForm());

        // Display application
        primaryStage.setScene(scene);
        primaryStage.show();`

application.css 与 Main.java 位于同一位置。

这是我的控制台输出。

Jan 10, 2019 8:30:20 AM javafx.fxml.FXMLLoader$ValueElement processValue
WARNING: Loading FXML document with JavaFX API of version 10.0.1 by JavaFX runtime of version 8.0.191
java.lang.NullPointerException
    at application.Main.start(Main.java:22)
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$161(LauncherImpl.java:863)
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$174(PlatformImpl.java:326)
    at com.sun.javafx.application.PlatformImpl.lambda$null$172(PlatformImpl.java:295)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$173(PlatformImpl.java:294)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)

这是我的CSS。为了方便测试,我只做了一处改动。

#startSurvey {

-fx-border-radius: 30;

}

这是我在 Eclipse 中看到的目录。

【问题讨论】:

  • getResource(...)的结果为null时,表示在指定位置找不到资源。确保路径正确且资源文件位于类路径中。
  • 我假设了很多,但我已经检查并重新检查了文件路径,它似乎是正确的。我将附上我的文件夹的屏幕截图。
  • 如果你使用getClass().getResource(...)而不是getClass().getClassLoader().getResource(...)会发生什么?
  • css 文件包含在源文件夹中这一事实不会自动导致 IDE 将其复制到构建文件夹中。您是否检查了包含 .class 文件的 css 文件的文件夹?
  • 所以当我取出getClassLoader()时,没有错误,但是css没有加载。自从我开始 JavaFX 以来,我遇到了一件奇怪的事情,我的程序只有在我包含 getClassLoader() 时才能工作。我在哪里可以找到这些文件夹?

标签: java css javafx nullpointerexception


【解决方案1】:

你不用说/application/application.css

就这样写application.css

这是因为主类和 css 文件都在同一个父目录中

和所有的 fxml 文件一样

更新 fxml的控制器中也有可能出现空指针。

更新 2 感谢

@kleopatra

不要使用getClass().getClassLoader().getResource(),只需使用getClass().getResource()

【讨论】:

  • 我也是这么想的。但我试过了,它没有改变。
  • 当心,对于类加载器和类,getResource 参数的解释是不同的: classloader.getResource(absolutePath) - 可以有前导斜线,没关系,与没有的 class.getResource(relativePath)斜线和绝对斜线。所以这里发生了一些非常可疑的事情......很可能是被发现时的正面;)
  • 这不是我的意思(可能不够清楚):我们可以使用其中一个,但必须注意区别:)
  • 所以,当我按照你说的做时,我没有收到任何错误,但实际上没有应用 css 中的任何内容。
  • 您的更正是正确的。问题最终实际上出现在我的 CSS 中。 -fx-border-radius 特性并没有改变我的预期,因此应用了 css,但是以一种可见的方式。但是谢谢你教我class...和class.classLoader()...之间的区别...
猜你喜欢
  • 2015-02-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2021-12-10
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多