JavaFx奇怪的异常!!应用程序启动方法中的异常
我希望你在这个困难时期做得很好 我正在为我的rest web服务开发一个JavaFx客户端,在运行我的应用程序时,有一个奇怪的异常指向我的LoginPresenter类,我检查了所有源路径,但没有任何信号,所以我来这里寻求帮助,错误如下: 应用程序启动方法中出现异常 java.lang.reflect.InvocationTargetException 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.base/java.lang.reflect.Method.invoke(Method.java:567) 位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplicationWithArgs(LaunchImpl.java:464) 位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication(LaunchImpl.java:363) 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法) 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 位于java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 位于java.base/java.lang.reflect.Method.invoke(Method.java:567) 位于java.base/sun.launcher.launchelper$FXHelper.main(launchelper.java:1051) 原因:java.lang.RuntimeException:应用程序启动方法中的异常 位于javafx.graphics/com.sun.javafx.application.LaunchImpl.launchApplication1(LaunchImpl.java:900) 在javafx.graphics/com.sun.javafx.application.LaunchImpl.lambda$launchApplication$2(LaunchImpl.java:195) 位于java.base/java.lang.Thread.run(Thread.java:830) 原因:java.lang.NullPointerException:inputStream为null。 位于javafx.fxml/javafx.fxml.fxmloader.loadImpl(fxmloader.java:2480) 位于javafx.fxml/javafx.fxml.fxmloader.load(fxmloader.java:2450) 位于fr.orleans.univ.projet/fr.orleans.univ.projet.view.LoginPresenter.getInstance(LoginPresenter.java:39) 位于fr.orleans.univ.projet/fr.orleans.univ.projet.PrimaryController.showLogin(PrimaryController.java:22) 位于fr.orleans.univ.projet/fr.orleans.univ.projet.App.start(App.java:30) 在javafx.graphics/com.sun.javafx.application.launchempl.lambda$launchApplication1$9(launchempl.java:846) 在javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455) 在javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428) 位于java.base/java.security.AccessController.doPrivileged(AccessController.java:391) 位于javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427) 位于javafx.graphics/com.sun.glass.ui.invokelateDispatcher$Future.run(invokelateDispatcher.java:96) 在javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.\u runLoop(本机方法) 在javafx.graphics/com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277) ... 还有一个 运行应用程序fr.orleans.univ.projet.App时出现异常 这是我的密码: 控制器JavaFx奇怪的异常!!应用程序启动方法中的异常,javafx,webservice-client,openjfx,Javafx,Webservice Client,Openjfx,我希望你在这个困难时期做得很好 我正在为我的rest web服务开发一个JavaFx客户端,在运行我的应用程序时,有一个奇怪的异常指向我的LoginPresenter类,我检查了所有源路径,但没有任何信号,所以我来这里寻求帮助,错误如下: 应用程序启动方法中出现异常 java.lang.reflect.InvocationTargetException 位于java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(本机方法)
PrimaryController.class
public class PrimaryController {
private Stage stage;
private Service service;
public PrimaryController(Stage stage, Service service) {
this.stage = stage;
this.service = service;
}
public void showLogin(){
LoginPresenter login = LoginPresenter.getInstance(this);
Scene scene = new Scene(login.getRoot());
stage.setScene(scene);
stage.show();
}
public void tenteLogin(String username, String password) {
service.login(username,password);
if(service.isAuthenticated()){
System.out.println("Connecté!");
}
}
}
public class LoginPresenter {
private PrimaryController primaryController;
public void setPrimaryController(PrimaryController primaryController){
this.primaryController=primaryController;
}
@FXML
private TextField username;
@FXML
private PasswordField password;
@FXML
private Parent root;
public Parent getRoot(){
return root;
}
public void login(ActionEvent actionEvent) {
primaryController.tenteLogin(username.getText(),password.getText());
}
public static LoginPresenter getInstance(PrimaryController primaryController){
FXMLLoader loader = new FXMLLoader();
try {
Parent root = loader.load(LoginPresenter.class.getResourceAsStream("login.fxml"));
} catch (IOException e){
e.printStackTrace();
}
LoginPresenter instance = loader.getController();
instance.setPrimaryController(primaryController);
return instance;
}
}
public class App extends Application {
// private static Scene scene;
public static void main(String[] args) {
launch();
}
@Override
public void start(Stage stage) {
Service service = new ServiceProxy();
PrimaryController primaryController = new PrimaryController(stage,service);
primaryController.showLogin();
}
}
这是我的LoginPresenter.class
public class PrimaryController {
private Stage stage;
private Service service;
public PrimaryController(Stage stage, Service service) {
this.stage = stage;
this.service = service;
}
public void showLogin(){
LoginPresenter login = LoginPresenter.getInstance(this);
Scene scene = new Scene(login.getRoot());
stage.setScene(scene);
stage.show();
}
public void tenteLogin(String username, String password) {
service.login(username,password);
if(service.isAuthenticated()){
System.out.println("Connecté!");
}
}
}
public class LoginPresenter {
private PrimaryController primaryController;
public void setPrimaryController(PrimaryController primaryController){
this.primaryController=primaryController;
}
@FXML
private TextField username;
@FXML
private PasswordField password;
@FXML
private Parent root;
public Parent getRoot(){
return root;
}
public void login(ActionEvent actionEvent) {
primaryController.tenteLogin(username.getText(),password.getText());
}
public static LoginPresenter getInstance(PrimaryController primaryController){
FXMLLoader loader = new FXMLLoader();
try {
Parent root = loader.load(LoginPresenter.class.getResourceAsStream("login.fxml"));
} catch (IOException e){
e.printStackTrace();
}
LoginPresenter instance = loader.getController();
instance.setPrimaryController(primaryController);
return instance;
}
}
public class App extends Application {
// private static Scene scene;
public static void main(String[] args) {
launch();
}
@Override
public void start(Stage stage) {
Service service = new ServiceProxy();
PrimaryController primaryController = new PrimaryController(stage,service);
primaryController.showLogin();
}
}
这是我的App.class
public class PrimaryController {
private Stage stage;
private Service service;
public PrimaryController(Stage stage, Service service) {
this.stage = stage;
this.service = service;
}
public void showLogin(){
LoginPresenter login = LoginPresenter.getInstance(this);
Scene scene = new Scene(login.getRoot());
stage.setScene(scene);
stage.show();
}
public void tenteLogin(String username, String password) {
service.login(username,password);
if(service.isAuthenticated()){
System.out.println("Connecté!");
}
}
}
public class LoginPresenter {
private PrimaryController primaryController;
public void setPrimaryController(PrimaryController primaryController){
this.primaryController=primaryController;
}
@FXML
private TextField username;
@FXML
private PasswordField password;
@FXML
private Parent root;
public Parent getRoot(){
return root;
}
public void login(ActionEvent actionEvent) {
primaryController.tenteLogin(username.getText(),password.getText());
}
public static LoginPresenter getInstance(PrimaryController primaryController){
FXMLLoader loader = new FXMLLoader();
try {
Parent root = loader.load(LoginPresenter.class.getResourceAsStream("login.fxml"));
} catch (IOException e){
e.printStackTrace();
}
LoginPresenter instance = loader.getController();
instance.setPrimaryController(primaryController);
return instance;
}
}
public class App extends Application {
// private static Scene scene;
public static void main(String[] args) {
launch();
}
@Override
public void start(Stage stage) {
Service service = new ServiceProxy();
PrimaryController primaryController = new PrimaryController(stage,service);
primaryController.showLogin();
}
}
最后,这是我的login.fxml
您的
LoginPresenter
类(根据堆栈跟踪)位于包fr.orleans.univ.projet.view
中
使用LoginPresenter.class.getResourceAsStream(“login.fxml”)
将在login.fxml
所在的包中查找资源。根据您的评论,您将login.fxml
放在源文件夹src/main/java/resources
(我假设“ressources”是一个输入错误),这(在大多数IDE或构建工具中使用标准配置)将把它放在构建中的默认包中
你也可以解决这个问题
LoginPresenter.class.getResourceAsStream("/login.fxml")
(注意前面的/
)login.fxml
放在同一个包中,您可以将它放在源文件夹src/main/java/resources/fr/orleans/univ/projet/view
中李>
一般来说,我认为后一种解决办法更好
您还需要确保在构建期间部署FXML文件;如果您使用的是Maven或Gradle等构建工具,那么默认情况下应该会发生这种情况;如果您使用的是IDE中的普通版本,则可能需要对其进行配置以确保实现这一点
如果需要进一步的故障排除,应检查buid文件夹(而不是源文件夹)的布局。根据您的构建工具或IDE,这可以是build
,bin
,target
,target/classes
,等等。查看构建文件夹,检查LoginPresenter.class
和login.fxml
之间的关系
一个稍微偏离主题点;我强烈建议使用资源URL来加载FXML,而不是流;i、 e.使用
LoginPresenter.class.getResource(...)
而不是
LoginPresenter.class.getResourceAsStream(...)
原因是加载方法的流版本无法设置
fxmloader
的location
属性(因为没有指定位置);因此,例如,将无法在FXML文件中工作。您的LoginPresenter
类(根据堆栈跟踪)位于包fr.orleans.univ.pro中