【发布时间】:2018-04-08 12:01:06
【问题描述】:
我在一个 JavaFX 程序中有以下单例,目的是为了更容易在应用程序的不同屏幕之间切换:
public class ScreenManager() {
private Stage mainStage;
private static ScreenManager instance;
private ScreenManager() {
// TODO
}
public static ScreenManager getInstance() {
if (instance == null ) {
return new ScreenManager();
} else {
return instance;
}
}
public void initialize(Stage mainStage) {
this.mainStage = mainStage;
}
public void switchToScreen(String fxmlPath) {
Parent newScreenRoot;
try {
URL pathToFxml = getClass().getResource(fxmlPath);
newScreenRoot = fxmlLoader.load(pathToFxml);
} catch (IOException e) {
throw new IllegalArgumentException("Failed to load FXML", e);
}
Scene newScreen = new Scene(newScreenRoot);
mainStage.setScene(newScreen);
mainStage.setMaximized(true);
}
}
在 JavaFX 的 start() 方法期间,通过对主阶段的引用调用初始化。
但是,当我稍后调用getInstance() 然后尝试切换屏幕时,我失败了NullPointerException,因为mainStage 为空。似乎该字段在第一次使用和后续使用之间变为空。怎么样?
为什么会这样?
【问题讨论】:
-
你永远不会初始化
instance... -
天哪。我已经做这整个编程工作 6 年了,但不知何故错过了这一点。我在调试器和所有东西中运行了它。这就是你每晚睡 4 小时时会发生的情况。
-
现在很多程序员都建议不要使用单例;您可以考虑使用依赖注入解决方案。
-
我考虑过,但我现在正在与一个非常绿色(学生)团队合作,如果我尝试将他们介绍给 DI 和 IoC,他们可能会融化。
-
FWIW 一位与我一起工作的研究生最近问我编程了多长时间。我必须计算一下……我很震惊地发现已经 38 年了。所以你在我的书中仍然是一个新手,如果它能让你感觉更好:)。
标签: java javafx nullpointerexception singleton