JavaFX MVC架构项目调用update时clientsList空指针异常问题
问题根因
你往观察者列表里注册的ServerView实例,和FXMLLoader加载FXML时自动创建的控制器实例不是同一个对象:
- FXML加载过程中,
FXMLLoader会反射创建fx:controller属性指定类的实例,自动完成@FXML字段注入,所以这个实例的initialize方法能正常操作clientsList - 你手动
new ServerView()创建的实例,不会触发FXML注入流程,所有@FXML注解的字段默认都是null,你把这个手动创建的实例加到了观察者列表,调用update的时候自然会抛出空指针
解决方案
你需要拿到FXMLLoader加载后生成的控制器实例,把这个实例注册到观察者列表,而不是自己手动new实例:
- 加载FXML时获取控制器实例
FXMLLoader loader = new FXMLLoader(getClass().getResource("你的server_view.fxml文件路径")); Parent root = loader.load(); // 拿到FXML自动创建的控制器实例 ServerView serverViewController = loader.getController(); // 把这个实例注册到你的观察者列表,不要用new ServerView() game.addObserver(serverViewController);
- 可选防护补充
可以在update方法里加空判断,避免极端场景崩溃:
@Override public synchronized void update(Model m) { System.out.println("[UPDATE] "+Thread.currentThread().getName()); if (clientsList != null) { clientsList.setText("test"); } }
你之前加的Platform.runLater逻辑是正确的,JavaFX UI操作必须在FX Application Thread执行,这部分不需要修改。
内容的提问来源于stack exchange,提问作者guillaumearnx
相关产品推荐
相关产品推荐

