You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaFX项目突发LoadException错误求助:未改动FXML文件位置

JavaFX项目LoadException问题求助

我在IntelliJ IDEA中开发JavaFX项目,此前运行正常且从未修改main-db.fxml的位置,但突然出现LoadException错误,IntelliJ标记了代码中加粗的行作为问题根源。

HelloApplication.java

public class HelloApplication extends Application {

    FileChooser fc = new FileChooser(); 

    public void start(Stage stage) throws Exception, InvalidFormatException {
        fc.setTitle("Select the Excel file");
        fc.getExtensionFilters().addAll(new FileChooser.ExtensionFilter("Excel file","*.xlsx"));
        File sheet = fc.showOpenDialog(new Stage());

        String sheetPath = sheet.getPath();

        if (sheet != null) {
            FXMLLoader loader = new FXMLLoader(HelloApplication.class.getResource("main-db.fxml"));

            // IntelliJ标记的问题行
            Scene scene = new Scene(loader.load(), 600, 480);
            stage.setTitle("Welcome");
            stage.setScene(scene);
            stage.show();
        }
    }
}

HelloController.java

public class HelloController {

    @FXML
    public Pane DBPane;

    @FXML
    private Label studentCount;

    @FXML
    private Label testLabel;

    // 用于从其他类访问标签的方法
    private final String path;
    private File sheet;

    public HelloController(String path) {
        this.path = path;
        this.sheet = new File(path);
    }

    public void showCount() throws IOException {
        FileInputStream fisDB = new FileInputStream(sheet);
        Workbook wb = new XSSFWorkbook(fisDB);
        Sheet names = wb.getSheetAt(0);
        int count = names.getPhysicalNumberOfRows();

        studentCount.setText(String.valueOf(count));
    }
}

main-db.fxml(路径:Users\PC\IdeaProjects\IA_real_2\src\main\resources\com\example\IA_real_2\main-db.fxml)

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

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.text.Font?>

<!-- IntelliJ标记的问题行 -->
<Pane fx:id="DBPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/20.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.example.ia_real_2.HelloController">
   <children>
      <Label fx:id="studentCount" layoutX="53.0" layoutY="64.0" text="Count here">
         <font>
            <Font size="41.0" />
         </font></Label>
   </children>
</Pane>

异常日志

Exception in Application start method

java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:119)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
    at java.base/java.lang.reflect.Method.invoke(Method.java:578)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1081)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:893)
    at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:1623)
Caused by: javafx.fxml.LoadException: 
/C:/Users/PC/IdeaProjects/IA_real_2/target/classes/com/example/ia_real_2/main-db.fxml:7

    at javafx.fxml@20/javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2722)
    at javafx.fxml@20/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:946)
    at javafx.fxml@20/javafx.fxml.FXMLLoader$InstanceDeclarationElement.processAttribute(FXMLLoader.java:983)
    at javafx.fxml@20/javafx.fxml.FXMLLoader$Element.processStartElement(FXMLLoader.java:230)
    at javafx.fxml@20/javafx.fxml.FXMLLoader$ValueElement.processStartElement(FXMLLoader.java:757)
    at javafx.fxml@20/javafx.fxml.FXMLLoader.processStartElement(FXMLLoader.java:2853)
    at javafx.fxml@20/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2649)
    at javafx.fxml@20/javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2563)
    at javafx.fxml@20/javafx.fxml.FXMLLoader.load(FXMLLoader.java:2531)
    at com.example.ia_real/com.example.ia_real_2.HelloApplication.start(HelloApplication.java:45)
    at javafx.graphics@20/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:839)
    at javafx.graphics@20/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:483)
    at javafx.graphics@20/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:456)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:400)
    at javafx.graphics@20/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:455)
    at javafx.graphics@20/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at javafx.graphics@20/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics@20/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:185)
    ... 1 more
Caused by: java.lang.NoSuchMethodException: com.example.ia_real_2.HelloController.<init>()
    at java.base/java.lang.Class.getConstructor0(Class.java:3685)
    at java.base/java.lang.Class.getDeclaredConstructor(Class.java:2854)
    at javafx.fxml@20/javafx.fxml.FXMLLoader$ValueElement.processAttribute(FXMLLoader.java:941)
    ... 17 more
Exception running application com.example.ia_real_2.HelloApplication

已尝试的解决方法

  • 将FXML文件路径改为/com/example/ia_real_2.fxml,无效
  • 检查依赖未发现异常
  • 对比默认JavaFX项目结构一致,但仍无法运行

问题根源及解决方法

从异常日志的Caused by: java.lang.NoSuchMethodException: com.example.ia_real_2.HelloController.<init>()可以看出,核心问题是FXMLLoader无法找到HelloController的无参构造函数。

当FXML文件中通过fx:controller指定控制器类时,FXMLLoader默认会调用该类的无参构造函数创建实例,但你的HelloController只定义了带String path参数的构造函数,导致加载失败。

解决步骤:

  1. 给HelloController添加无参构造函数,或修改现有构造函数支持无参:
public class HelloController {
    @FXML
    public Pane DBPane;
    @FXML
    private Label studentCount;
    @FXML
    private Label testLabel;

    private String path;
    private File sheet;

    // 添加无参构造函数
    public HelloController() {
        // 留空或设置默认值
    }

    // 保留带参数的构造函数(可选)
    public HelloController(String path) {
        this.path = path;
        this.sheet = new File(path);
    }

    // 原有showCount方法
    public void showCount() throws IOException {
        if (sheet == null) return; // 增加空值判断
        FileInputStream fisDB = new FileInputStream(sheet);
        Workbook wb = new XSSFWorkbook(fisDB);
        Sheet names = wb.getSheetAt(0);
        int count = names.getPhysicalNumberOfRows();

        studentCount.setText(String.valueOf(count));
    }
}
  1. 修改HelloApplication的FXML加载逻辑,手动传入参数给控制器:
    如果使用手动设置控制器的方式,需要删除FXML文件中的fx:controller="com.example.ia_real_2.HelloController"属性,避免重复创建实例:
if (sheet != null) {
    FXMLLoader loader = new FXMLLoader(HelloApplication.class.getResource("main-db.fxml"));
    // 手动创建控制器并传入路径
    HelloController controller = new HelloController(sheet.getPath());
    loader.setController(controller);
    Scene scene = new Scene(loader.load(), 600, 480);
    // 调用统计方法
    controller.showCount();
    stage.setTitle("Welcome");
    stage.setScene(scene);
    stage.show();
} else {
    // 处理用户取消文件选择的情况
    System.out.println("用户取消了文件选择");
    stage.close();
}
  1. 修复空指针隐患:原代码中String sheetPath = sheet.getPath();在用户取消选择时会抛出空指针,需先判断sheet != null再执行后续逻辑。

内容的提问来源于stack exchange,提问作者wan1796

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 13:12:01