我在netbeans中有以下代码(在同一项目中使用javafx):
public class ExperimentControler {
public static HashMap<String,Double> userInput = null;
public static ObservableMapWrapper<String,Double> userInputObservable = null;
}
和
static final String totalDistance = "Total distance";
public static void main(String[] args) {
ExperimentControler.userInput = new HashMap<String,Double>();
ExperimentControler.userInput.put(totalDistance, 300.0);
ExperimentControler.userInputObservable = new ObservableMapWrapper<String,Double>(ExperimentControler.userInput);
Application.launch(PhysicsGui.class, args);
}
@Override
public void start(Stage primaryStage) {
ExperimentControler.userInput.get(totalDistance);
//...
}
这在netbeans中工作得很好。
如果我"清理并构建"项目,生成的.jar文件会在这一行抛出空指针异常:
ExperimentControler.userInput.get(totalDistance);
另外,这是我在netbeans之外的java版本:
>java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode)
我也尝试使用jre 1.7.0,但结果完全相同…
在netbeans中我安装了jdk 1.6.0_26.
OK…感谢Kal的评论:
你是如何运行这个程序的?你试过把在主方法中使用System.out.printlns()来确保它们是正确的在应用程序因NPE崩溃之前调用?
我发现下面的(javafx)代码(一定是这个…没有其他入口点):
@Override
public void start(Stage primaryStage) {
当我将作为独立运行时,它会绕过main()。也许根本原因完全不同,我不知道…
事实是,在netbeans中,main()正在运行,而在单机上则没有。
我也检查了jar的清单,主类是正确的。(以防万一)
我无法想象主程序根本没有运行!
因此,我将main()中的代码移动到重写的start方法中,它就工作了。
规范指出start()方法是javafx应用程序的主要入口点。但是,在我的理解中,main()仍然应该在start()之前调用。这可能是javafx的一个bug。
我以前有过这样的东西。
Hashmap自动装箱可能是这里的问题。我认为你试图自动设置一个空值。
试
ExperimentControler.userInput.put(totalDistance, new Double(300.0));
EDIT OK谢谢@气垫船,如果这不起作用,您必须在您的代码中的其他地方存储您的哈希图中的null
。请记住,如果你赋值给双精度对象,get(totalDistance)
将被get(totalDistance).doubleValue();
取代。
至于为什么它不能在罐子外工作…不知道,对不起。
PS ExperimentControler.userInput.get(totalDistance);
的确切线是什么?你是把它分配给Double
还是double
?