netbeans之外的Java hashmap空指针



我在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 ?

相关内容

  • 没有找到相关文章

最新更新