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

JavaFX应用ListView绑定数据库数据时出现空指针异常求助

问题根源

你遇到的NullPointerException是因为FXML加载顺序错误:你先调用了fxmlLoader.load()加载界面,之后才设置控制器fxmlLoader.setController(controller)。FXML加载器只有在加载FXML文件时,才会将界面上的控件注入到关联的控制器实例中,后续再设置控制器已经无法完成控件注入,导致MythosList始终为null。

修复方案

有两种常用的修复方式,任选其一即可:

方案1:调整加载顺序,先设控制器再加载FXML

修改主应用的start方法,把setController放在load之前:

public void start(Stage stage) throws IOException {
    AppCtrl controller = new AppCtrl();
    FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource("main.fxml"));
    
    // 先绑定控制器,再加载FXML
    fxmlLoader.setController(controller);
    Scene scene = new Scene(fxmlLoader.load());

    controller.cargarDatos(); 

    stage.initStyle(StageStyle.TRANSPARENT);
    scene.setFill(Color.TRANSPARENT);
    stage.setScene(scene);
    stage.show();
}

方案2:在FXML文件中指定控制器(更推荐)

  1. 打开你的main.fxml,在根布局节点添加fx:controller属性,指定控制器的完整类名:
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane xmlns:fx="http://javafx.com/fxml" fx:controller="你的包路径.AppCtrl">
    <!-- 确保ListView的fx:id和控制器中的变量名完全一致 -->
    <ListView fx:id="MythosList" />
</AnchorPane>
  1. 修改主应用代码,无需手动创建控制器,直接从加载器获取已完成控件注入的实例:
public void start(Stage stage) throws IOException {
    FXMLLoader fxmlLoader = new FXMLLoader(App.class.getResource("main.fxml"));
    Scene scene = new Scene(fxmlLoader.load());
    
    // 获取加载器自动创建并注入控件的控制器实例
    AppCtrl controller = fxmlLoader.getController();
    controller.cargarDatos(); 

    stage.initStyle(StageStyle.TRANSPARENT);
    scene.setFill(Color.TRANSPARENT);
    stage.setScene(scene);
    stage.show();
}
关键注意事项
  • 确保FXML中ListView的fx:id值和控制器里@FXML private ListView<Mytho> MythosList;的变量名完全匹配(Java大小写敏感,不能有拼写错误)。
  • 两种方案不要混用,要么手动设置控制器并调整顺序,要么在FXML中指定控制器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:35:11