提问人:DIEGO IGLESIAS 提问时间:6/9/2022 最后编辑:DIEGO IGLESIAS 更新时间:6/9/2022 访问量:449
getClass().getResource() 抛出 NullPointerException [duplicate]
getClass().getResource() throws a NullPointerException [duplicate]
问:
我目前正在尝试使用 IntelliJ 和 JavaFX 开始编写应用程序,我有以下代码:
package main.gui;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.net.URL;
public class MainMenu extends Application {
@Override
public void start(Stage stage) throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("hello-view.fxml"));
URL url = getClass().getResource("hello-view.fxml");
System.out.println("URL = " + url);
Parent root = FXMLLoader.load(url);
Scene scene = new Scene(root,1920,1080);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
}
我的文件结构:
- src/main/gui/MainMenu.java
- src/main/gui/hello-view.fxml
我得到这个例外:
Exception in Application start method
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1082)
Caused by: java.lang.RuntimeException: Exception in Application start method
at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:901)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:196)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NullPointerException: Location is required.
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3324)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3287)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3255)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3227)
at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3203)
at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:3196)
at main/main.gui.MainMenu.start(MainMenu.java:13)
at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:847)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:484)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:457)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:456)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:184)
... 1 more
它输出:URL = null
我尝试了很多我在这个网站上找到的东西,但没有成功......
提前感谢您的帮助:)
答:
0赞
DIEGO IGLESIAS
6/9/2022
#1
添加更多细节:我正在使用 Maven,我使用 随 IntelliJ 提供的 JavaFX 项目创建工具。
我按照@MatteoNNZ的建议,简单地将我的fxml文件放入ressources文件夹(src/main/resources)中,使它工作。 我稍微调整了一下代码,使其具有以下内容:
package main.gui;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.net.URL;
public class MainMenu extends Application {
@Override
public void start(Stage stage) throws Exception {
URL url = getClass().getClassLoader().getResource("hello-view.fxml");
System.out.println("URL = " + url);
Parent root = FXMLLoader.load(url);
Scene scene = new Scene(root,1920,1080);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
}
显然,它可以像这样简化:
@Override
public void start(Stage stage) throws Exception {
// URL url = getClass().getClassLoader().getResource("hello-view.fxml"); |
// System.out.println("URL = " + url); | Remove these 3 lines
// Parent root = FXMLLoader.load(url); |
Scene scene = new Scene(FXMLLoader.load(getClass().getClassLoader().getResource("hello-view.fxml")),1920,1080);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
但它非常丑陋。
谢谢大家的帮助和非常快速的回答:)。
评论
4赞
Slaw
6/9/2022
请注意,如果您使用的是 Maven,那么您的源文件(即文件)都应该在目录下。下面的任何目录都是包。您可能也想解决此问题。*.java
src/main/java
src/main/java
0赞
Matteo NNZ
6/9/2022
事实上,正如@Slaw提到的,如果你使用的是 IntelliJ 项目向导(我确信这一点),你应该坚持使用他们建议的结构,Java 下的源文件(因此它们成为包)和资源下的资源文件
1赞
jewelsea
6/10/2022
有关基于 Maven 的项目的项目结构的更多信息,请参见 baeldung 中也介绍了标准目录布局,以更好地了解您的构建工具学习 maven 入门和 maven 基础知识以及在 ide 中使用 maven。
评论
main
src
ClassLoader#getResource(String)
Class#getResource(String)
opens
ClassLoader#getResource(String)
Class#getResource(String)
src/main/resources
src/main/java
src/main
getClass().getClassLoader().getResource()
.getClassLoader()
.getResource
.getClassLoader()
MyClass.class
getClass()
getClass()