当输入为double时,使用HashMap的NullPointerException <Integer,Double>

Ste*_*wDK 1 java multithreading nullpointerexception

简介
我在弄清楚是什么导致我在HashMap中获得NullPointerException时遇到了一些困难,这应该是相当简单的.要理解为什么我使用HashMap,我认为描述它的最好方法是说我有一个多线程程序,它有一些我想要存储的结果.在那个上下文中,我创建了一个名为的类SaveMethod,用于存储进程中的值.因为我永远不知道哪个线程将首先完成,所以我使用a HashMapi在这个hashmap中存储线程的值,如下所示:

代码:
首先是HashMap的定义:

// The first Integer element is the thread index, the second is the Double value
private static HashMap<Integer,Double> AUC = new HashMap<Integer,Double>();
Run Code Online (Sandbox Code Playgroud)

然后我调用这个方法,一个线程终止存储:

public static void setAUC(double AUC,int i){        
    Double AUCtemp = AUC;
    SaveMethod.AUC.put(i,AUCtemp);
}
Run Code Online (Sandbox Code Playgroud)

更多描述:
现在,我已经通过以下方式成功实现了上述功能:

private static HashMap<Integer,Double[]> AUC = new HashMap<Integer,Double[]>();
Run Code Online (Sandbox Code Playgroud)

也就是说,与前面的例子相比,Double[]而不是Double.这非常有效.

问题
我的问题有两个:1)Exception in thread "main" java.lang.NullPointerException当我尝试调用此代码时,为什么会收到:

    public static Double getAUC(int i){
        double AUC = SaveMethod.AUC.get(i);
        return AUC;
    }
Run Code Online (Sandbox Code Playgroud)

2)这个保存选项线程安全吗?

一些额外的理由为什么我需要这个:

让我试着说明为什么我需要这个存储选项.我有一组需要执行的计算,比方说100.每次计算大约需要10秒钟.现在,为了减少计算时间,我实现了多线程,以便可以同时完成这些计算.但这些计算并不以任何方式相互依赖.但是,我需要为每个计算存储每个线程的每个结果(这是很多不同的值/矩阵等),以便可以从其他方法/类全局到达结果以用于绘图目的.您重新考虑的是如何存储计算结果并维护线程安全的环境?

Jon*_*eet 6

1)为什么我在线程"main"中得到Exception

因为给定的整数可能没有值,所以get调用返回null.然后,您将取消装箱,这会引发异常.你的代码是有效的:

public static Double getAUC(int i){
    Double temp = SaveMethod.AUC.get(i); // This can return null
    double AUC = temp.doubleValue(); // This was auto-unboxing

    Double boxed = Double.valueOf(AUC); // This was boxing
    return boxed;
}
Run Code Online (Sandbox Code Playgroud)

如果您想要在null缺少密钥时返回,只需避免转换为Double.您的方法可以简单如下:

public static Double getAUC(int i) {
    return SaveMethod.AUC.get(i);
}
Run Code Online (Sandbox Code Playgroud)

目前尚不清楚你是想要回归null,还是抛出其他一些例外.

2)这个保存选项线程安全吗?

好吧HashMap,开始时不是线程安全的,所以不...考虑使用ConcurrentHashMap.