当前位置: 首页 > 知识库问答 >
问题:

应用程序启动方法中出现异常。OpenJFX 13与Maven

吕承福
2023-03-14

错误:

Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.IllegalStateException: Location is not set.
    at javafx.fxml/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2459)
    at javafx.fxml/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2435)
    at org.openjfx/org.openjfx.App.loadFXML(App.java:31)
    at org.openjfx/org.openjfx.App.start(App.java:20)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    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:174)
    ... 1 more
Exception running application org.openjfx.App
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.openjfx</groupId>
    <artifactId>Oblig1</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-controls</artifactId>
            <version>13</version>
        </dependency>
        <dependency>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-fxml</artifactId>
            <version>13</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <release>11</release>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.openjfx</groupId>
            <artifactId>javafx-maven-plugin</artifactId>
            <version>0.0.1</version>
            <configuration>
                <mainClass>org.openjfx.App</mainClass>
            </configuration>
        </plugin>
        </plugins>
    </build>
</project>
package org.openjfx;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

/**
 * JavaFX App
 */
public class App extends Application {

    private static Scene scene;

    @Override
    public void start(Stage stage) throws IOException {
        scene = new Scene(loadFXML("/org.openjfx/primary"));
        stage.setScene(scene);
        stage.show();
    }

    static void setRoot(String fxml) throws IOException {
        scene.setRoot(loadFXML(fxml));
    }

    private static Parent loadFXML(String fxml) throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource(fxml + ".fxml"));
        return fxmlLoader.load();
    }

    public static void main(String[] args) {
        launch();
    } 

}

primary.fxml:

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>

<VBox alignment="CENTER" spacing="20.0" xmlns="http://javafx.com/javafx/8.0.171" 
xmlns:fx="http://javafx.com/fxml/1" fx:controller="kristoffer.PrimaryController">
   <children>
      <Label text="Primary View" />
      <Button fx:id="primaryButton" text="Switch to Secondary View" onAction="#switchToSecondary"/>
   </children>
   <padding>
      <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
   </padding>
</VBox>

primaryController.java:

package org.openjfx;

import java.io.IOException;
import javafx.fxml.FXML;

public class PrimaryController {

}
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.VBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.Button?>
<?import javafx.geometry.Insets?>

<VBox alignment="CENTER" spacing="20.0" 
xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" 
fx:controller="org.openjfx.SecondaryController">
    <children>
        <Label text="Secondary View" />
        <Button fx:id="secondaryButton" text="Switch to Primary View" 
onAction="#switchToPrimary" />
    </children>
    <padding>
        <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
    </padding>
</VBox>

secondaryController.java:

package org.openjfx;

import java.io.IOException; 
import javafx.fxml.FXML;

public class SecondaryController {

    @FXML
    private void switchToPrimary() throws IOException {
        App.setRoot("PrimaryController");
    }
}
    src
        main
            java
                org.openjfx
                    App.java
                    PrimaryController.java
                    SecondaryController.java
            resources 
                org.openjfx
                    primary.fxml
                    secondary.fxml

JAR-TF义务1.jar:

我想这可能与FXML加载器中的链接有关,我也见过其他人有类似的问题(比如这个问题),但我的目录中有资源文件夹不像他们的。感谢任何帮助,谢谢。

共有1个答案

滕祯
2023-03-14

错误消息

java.lang.IllegalStateException: Location is not set.

表示您提供给fxmlloader构造函数的URL为null。如果找不到指定的资源,Class.GetResource(...)方法会无提示地返回NULL

发生这种情况是因为提供给LoadFXML方法以及最终提供给app.class.getResource(...)的资源名称不正确。您为class.getResource(...)提供的值是一个资源名称,其详细信息将在此处记录。

scene = new Scene(loadFXML("/org/openjfx/primary"));
scene = new Scene(loadFXML("primary"));

资源、名称和上下文

资源由一个字符串标识,该字符串由一系列子字符串组成,子字符串由斜杠(/)分隔,后跟一个资源名。每个子字符串必须是有效的Java标识符。资源名称的格式为shortName或shortName.Extension。shortName和extension都必须是Java标识符。

资源名称的解释是相对于类加载器实例的。由ClassLoader类实现的方法执行此解释。

...

资源名称

给一个类方法的资源名称可能有一个初始起始“/”,它将它标识为一个“绝对”名称。不以“/”开头的资源名称为“relative”。

因此“/org.openjfx/primary”不是有效的资源名称,因为“org.openjfx”不是有效的Java标识符。

在您的结构中,请注意org.openjfx不是一个文件夹,而是一个包。IDE和构建工具将把它转换为文件系统上的文件夹层次结构,最终转换为jar文件中的文件夹层次结构,包-子包结构被文件夹和子文件夹所取代。因此,在源代码结构中,您将拥有一个“Java”文件夹,其中包含“org”子文件夹和“openjfx”子文件夹,以及org.openjfx包中类的Java源文件。在“resources”文件夹中,您还将有一个“org”子文件夹,一个“openjfx”子文件夹,以及您创建的资源文件(包括FMXL文件)。

构建工具(Maven或仅仅是您的IDE)识别特定的源文件夹;在您的案例中,这些配置包括“java”和“resources”。构建应用程序时,源文件夹下的结构的联合将在构建目标中重新创建;在这里,这只会产生一个org文件夹和openjfx子文件夹。任何Java源文件都编译成类文件;任何其他文件都只是复制的。最后,将整个内容绑定到一个jar文件(本质上只是一个zip存档文件)中。

jar -tf Oblig1-1.0-SNAPSHOT.jar

(我认为objil1-1.0-snapshot.jar是生成的jar文件的名称,但如果需要,显然要对其进行调整)。您应该看到我概述的文件夹结构,输出应该包括

/org/openjfx/App.class
/org/openjfx/PrimaryController.class
/org/openjfx/SecondaryController.class
/org/openjfx/primary.fxml
/org/openjfx/secondary.fxml

另外,您不应该使用org.openjfx作为自己的包名和Maven组ID;使用您自己或您的组织特有的东西。

 类似资料:
  • 我的主 LoginController.java 请注意,我还没有在userController.java中编写任何代码,我只是为user.fxml编写了ui 在javafx.fxml.fxmlloader.constructloadexception(fxmlloader.java:2597)在javafx.fxml.fxmlloader.access$100(fxmlloader.java:1

  • 我刚刚开始使用JavaFX,我试图构建一个简单的应用程序,其中包含标签、文本字段和按钮,当单击这些按钮时,将标签的值设置为文本字段的值。在我把控制器连接到主文件之前,一切都很顺利。这是我的代码: 我尝试了在StackOverflow上找到的多个答案,但我找到的都是2年前的答案,对我的代码没有任何积极的影响。 编辑:在此处堆栈跟踪:

  • 乍一看,这个问题似乎是重复的。我已经在谷歌搜索了一些,但不幸的是,没有一个结果不符合我。我给出了下面的问题链接。 应用程序启动方法java.lang.Reflect.InvocationTargetException JavaFX图像转换中出现异常 JavaFX-应用程序启动方法中的异常? 应用程序启动方法中出现异常 堆栈跟踪: 无法从此StackTrace跟踪错误。然后我在start方法中使用了

  • 我尝试创建一个包含一个文本字段和按钮的屏幕,并重复“应用程序启动方法中的异常”。第一次我试着从这个问题中解题,但没有奏效: 应用程序启动方法中出现异常 应用程序启动方法javafx gui中出现异常 我使用Java11、JavaFX11。对于javaFx,我使用Maven。 主要的类别是: FXML文件为:

  • 我正在尝试使用intelliJ IDEA创建我的第一个JavaFX程序 我得到这个错误: 这是我的FXML文件: main.java: 这是项目结构: 项目结构 我甚至更改了fxml文件的位置,但他不断得到相同的错误。 FXML文件和Main.java在同一个包中 我是Ubuntu

  • 我试图创建一个应用程序,但我一直遇到相同的运行时异常。我已经和它斗争了好几天,我不知道如何修复它。任何建议都将不胜感激!这是我在Java中的第一个相当长的项目,所以我决心解决它;只是有相当多的麻烦,我不知道如何克服这一点。