gpt4 book ai didi

java - 当输入为 double 时,HashMap 出现 NullPointerException

转载 作者:行者123 更新时间:2023-11-29 10:02:11 25 4
gpt4 key购买 nike

简介
我在弄清楚是什么导致我在应该相当简单的 HashMap 中获得 NullPointerException 时遇到了一些困难。要理解我为什么使用 HashMap,我认为描述它的最佳方式是说我有一个多线程程序,其中有一些我想存储的结果。在这种情况下,我创建了一个名为 SaveMethod 的类,它将用于存储流程中的值。因为人们永远不知道哪个线程将首先完成,所以我使用 HashMap 将线程 i 的值存储在此 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>();

然后我在线程终止存储时调用此方法:

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

一些更多的描述:
现在,我以前通过使用以下方法成功实现了上述功能:

private static HashMap<Integer,Double[]> AUC = new HashMap<Integer,Double[]>();

也就是与前面的例子相比,Double[]代替了Double。这非常有效。

问题
我的问题是双重的:1)当我尝试调用此代码时,为什么会出现 Exception in thread "main"java.lang.NullPointerException:

    public static Double getAUC(int i){
double AUC = SaveMethod.AUC.get(i);
return AUC;
}

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

我需要这个的一些额外原因:

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

最佳答案

1) Why am I getting Exception in thread "main"

因为给定的整数可能没有值,所以 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;
}

如果您只想在 key 丢失时返回 null 而不是,只需避免转换为 Double。您的方法可以很简单:

public static Double getAUC(int i) {
return SaveMethod.AUC.get(i);
}

不清楚您是想要只是返回null,还是抛出一些其他类型的异常。

2) is this saving option thread safe?

HashMap 一开始不是线程安全的,所以不...考虑使用 ConcurrentHashMap相反。

关于java - 当输入为 double 时,HashMap<Integer,Double> 出现 NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21305431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com