java程序的逻辑错误造成空指针异常怎么处理的

haibinji 发布于 2016/11/22 16:32
阅读 804
收藏 0

java程序的逻辑错误造成空指针异常怎么处理的,一个List<HashMap<String, Integer>>,在遍历这个List之前往List里加入了几个Map,并且对这些Map加入key,value,按照正常的逻辑应该是Map数据都赋值好了后,后面遍历List时,对Map进行操作,但这个时候出现空指针异常,检验了下List中有时候的Map数据完整,有时候的数据不完整,请问是什么原因造成的呢?感觉Map已经在前面加入各个数据了,为什么Map还会出现null key,其实问题很明显,就是Map中有key为空,请问为什么这样,应该主要还是Map加入数据时不完整的问题,请问为什么?

//计算均方差,代表负载不均衡度
private Float calculateMinMse(){
Vector<MCT> temp = getSeqExcute();
Vms vmsTemp = vms;
Hosts hostsTemp = hosts;

//存储Host上各个资源的使用和总体情况
HashMap<String, Integer> hostUsedRes0 = new HashMap<String, Integer>();
HashMap<String, Integer> hostUsedRes1 = new HashMap<String, Integer>();
HashMap<String, Integer> hostUsedRes2 = new HashMap<String, Integer>();
HashMap<String, Integer> hostUsedRes3 = new HashMap<String, Integer>();
HashMap<String, Integer> hostUsedRes4 = new HashMap<String, Integer>();


for(MCT mct : temp){
if(mct.hostIndex == 0){
hostUsedRes0.put("totalRams", hostsTemp.getHrams()[0]);
hostUsedRes0.put("totalBws", hostsTemp.getHbws()[0]);
hostUsedRes0.put("totalStorages", hostsTemp.getHstorages()[0]);
hostUsedRes0.put("totalPeNums", hostsTemp.getHpeNums()[0]);
if(!hostUsedRes0.containsKey("usedVrams")){
hostUsedRes0.put("usedVrams", 0);
} else {
hostUsedRes0.put("usedVrams", hostUsedRes0.get("usedVrams")+vmsTemp.getVrams()[mct.vmIndex]);
}
if(!hostUsedRes0.containsKey("usedVbws")){
hostUsedRes0.put("usedVbws", 0);
} else {
hostUsedRes0.put("usedVbws", hostUsedRes0.get("usedVbws")+vmsTemp.getVbws()[mct.vmIndex]);
}
if(!hostUsedRes0.containsKey("usedVsizes")){
hostUsedRes0.put("usedVsizes", 0);
} else {
hostUsedRes0.put("usedVsizes", hostUsedRes0.get("usedVsizes")+vmsTemp.getVsizes()[mct.vmIndex]);
}
if(!hostUsedRes0.containsKey("usedVpesNumbers")){
hostUsedRes0.put("usedVpesNumbers", 0);
} else {
hostUsedRes0.put("usedVpesNumbers", hostUsedRes0.get("usedVpesNumbers")+vmsTemp.getVpesNumbers()[mct.vmIndex]);
}
}

if(mct.hostIndex == 1){
hostUsedRes1.put("totalRams", hostsTemp.getHrams()[1]);
hostUsedRes1.put("totalBws", hostsTemp.getHbws()[1]);
hostUsedRes1.put("totalStorages", hostsTemp.getHstorages()[1]);
hostUsedRes1.put("totalPeNums", hostsTemp.getHpeNums()[1]);
if(!hostUsedRes1.containsKey("usedVrams")){
hostUsedRes1.put("usedVrams", 0);
} else {
hostUsedRes1.put("usedVrams", hostUsedRes1.get("usedVrams")+vmsTemp.getVrams()[mct.vmIndex]);
}
if(!hostUsedRes1.containsKey("usedVbws")){
hostUsedRes1.put("usedVbws", 0);
} else {
hostUsedRes1.put("usedVbws", hostUsedRes1.get("usedVbws")+vmsTemp.getVbws()[mct.vmIndex]);
}
if(!hostUsedRes1.containsKey("usedVsizes")){
hostUsedRes1.put("usedVsizes", 0);
} else {
hostUsedRes1.put("usedVsizes", hostUsedRes1.get("usedVsizes")+vmsTemp.getVsizes()[mct.vmIndex]);
}
if(!hostUsedRes1.containsKey("usedVpesNumbers")){
hostUsedRes1.put("usedVpesNumbers", 0);
} else {
hostUsedRes1.put("usedVpesNumbers", hostUsedRes1.get("usedVpesNumbers")+vmsTemp.getVpesNumbers()[mct.vmIndex]);
}
}

if(mct.hostIndex == 2){
hostUsedRes2.put("totalRams", hostsTemp.getHrams()[2]);
hostUsedRes2.put("totalBws", hostsTemp.getHbws()[2]);
hostUsedRes2.put("totalStorages", hostsTemp.getHstorages()[2]);
hostUsedRes2.put("totalPeNums", hostsTemp.getHpeNums()[2]);
if(!hostUsedRes2.containsKey("usedVrams")){
hostUsedRes2.put("usedVrams", 0);
} else {
hostUsedRes2.put("usedVrams", hostUsedRes2.get("usedVrams")+vmsTemp.getVrams()[mct.vmIndex]);
}
if(!hostUsedRes2.containsKey("usedVbws")){
hostUsedRes2.put("usedVbws", 0);
} else {
hostUsedRes2.put("usedVbws", hostUsedRes2.get("usedVbws")+vmsTemp.getVbws()[mct.vmIndex]);
}
if(!hostUsedRes2.containsKey("usedVsizes")){
hostUsedRes2.put("usedVsizes", 0);
} else {
hostUsedRes2.put("usedVsizes", hostUsedRes2.get("usedVsizes")+vmsTemp.getVsizes()[mct.vmIndex]);
}
if(!hostUsedRes2.containsKey("usedVpesNumbers")){
hostUsedRes2.put("usedVpesNumbers", 0);
} else {
hostUsedRes2.put("usedVpesNumbers", hostUsedRes2.get("usedVpesNumbers")+vmsTemp.getVpesNumbers()[mct.vmIndex]);
}
}

if(mct.hostIndex == 3){
hostUsedRes3.put("totalRams", hostsTemp.getHrams()[3]);
hostUsedRes3.put("totalBws", hostsTemp.getHbws()[3]);
hostUsedRes3.put("totalStorages", hostsTemp.getHstorages()[3]);
hostUsedRes3.put("totalPeNums", hostsTemp.getHpeNums()[3]);
if(!hostUsedRes3.containsKey("usedVrams")){
hostUsedRes3.put("usedVrams", 0);
} else {
hostUsedRes3.put("usedVrams", hostUsedRes3.get("usedVrams")+vmsTemp.getVrams()[mct.vmIndex]);
}
if(!hostUsedRes3.containsKey("usedVbws")){
hostUsedRes3.put("usedVbws", 0);
} else {
hostUsedRes3.put("usedVbws", hostUsedRes3.get("usedVbws")+vmsTemp.getVbws()[mct.vmIndex]);
}
if(!hostUsedRes3.containsKey("usedVsizes")){
hostUsedRes3.put("usedVsizes", 0);
} else {
hostUsedRes3.put("usedVsizes", hostUsedRes3.get("usedVsizes")+vmsTemp.getVsizes()[mct.vmIndex]);
}
if(!hostUsedRes3.containsKey("usedVpesNumbers")){
hostUsedRes3.put("usedVpesNumbers", 0);
} else {
hostUsedRes3.put("usedVpesNumbers", hostUsedRes3.get("usedVpesNumbers")+vmsTemp.getVpesNumbers()[mct.vmIndex]);
}
}

if(mct.hostIndex == 4){
hostUsedRes4.put("totalRams", hostsTemp.getHrams()[4]);
hostUsedRes4.put("totalBws", hostsTemp.getHbws()[4]);
hostUsedRes4.put("totalStorages", hostsTemp.getHstorages()[4]);
hostUsedRes4.put("totalPeNums", hostsTemp.getHpeNums()[4]);
if(!hostUsedRes4.containsKey("usedVrams")){
hostUsedRes4.put("usedVrams", 0);
} else {
hostUsedRes4.put("usedVrams", hostUsedRes4.get("usedVrams")+vmsTemp.getVrams()[mct.vmIndex]);
}
if(!hostUsedRes4.containsKey("usedVbws")){
hostUsedRes4.put("usedVbws", 0);
} else {
hostUsedRes4.put("usedVbws", hostUsedRes4.get("usedVbws")+vmsTemp.getVbws()[mct.vmIndex]);
}
if(!hostUsedRes4.containsKey("usedVsizes")){
hostUsedRes4.put("usedVsizes", 0);
} else {
hostUsedRes4.put("usedVsizes", hostUsedRes4.get("usedVsizes")+vmsTemp.getVsizes()[mct.vmIndex]);
}
if(!hostUsedRes4.containsKey("usedVpesNumbers")){
hostUsedRes4.put("usedVpesNumbers", 0);
} else {
hostUsedRes4.put("usedVpesNumbers", hostUsedRes4.get("usedVpesNumbers")+vmsTemp.getVpesNumbers()[mct.vmIndex]);
}
}
}

List<HashMap<String, Integer>> list = new ArrayList<HashMap<String, Integer>>();
list.add(hostUsedRes0);
list.add(hostUsedRes1);
list.add(hostUsedRes2);
list.add(hostUsedRes3);
list.add(hostUsedRes4);

float pramUtil = 0;
float pramAveUtil = 0;
float pbwUtil = 0;
float pbwAveUtil = 0;
float pstorageUtil = 0;
float pstorageAveUtil = 0;
float ppeNumUtil = 0;
float ppeNumAveUtil = 0;

for(HashMap<String, Integer> map : list){

// if(!map.containsKey("usedVrams")){
// System.out.println("map中有key为null");
// break;
// }
if(map.containsKey("usedVrams") && map.containsKey("usedVbws") && map.containsKey("usedVsizes") && map.containsKey("usedVpesNumbers")){
pramUtil += Math.pow((float)map.get("usedVrams")/map.get("totalRams"), 2)/5;////////////////////////////////////////////////////////////////////////////////////////就是这里空指针异常
pramAveUtil += (float)map.get("usedVrams")/map.get("totalRams")/5;

pbwUtil += Math.pow((float)map.get("usedVbws")/map.get("totalBws"), 2)/5;
pbwAveUtil += (float)map.get("usedVbws")/map.get("totalBws")/5;

pstorageUtil += Math.pow((float)map.get("usedVsizes")/map.get("totalStorages"), 2)/5;
pstorageAveUtil += (float)map.get("usedVsizes")/map.get("totalStorages")/5;

ppeNumUtil += Math.pow((float)map.get("usedVpesNumbers")/map.get("totalPeNums"), 2)/5;
ppeNumAveUtil += (float)map.get("usedVpesNumbers")/map.get("totalPeNums")/5;
}

}

float NLBIram = (float) (pramUtil - Math.pow(pramAveUtil, 2));
float NLBIbw = (float) (pbwUtil - Math.pow(pbwAveUtil, 2));
float NLBIdisk = (float) (pstorageUtil - Math.pow(pstorageAveUtil, 2));
float NLBIcpu = (float) (ppeNumUtil - Math.pow(ppeNumAveUtil, 2));

float w1 = 0.25f, w2 = 0.25f, w3 = 0.25f, w4 = 0.25f;
float NLBItotal = w1*NLBIram + w2*NLBIbw + w3*NLBIdisk + w4*NLBIcpu;

return NLBItotal;
}

加载中
0
Joyzhou
Joyzhou
HashTable
0
太黑_thj
太黑_thj
你这问题问得,首先你要吧你给map赋值的代码贴出来  人家才知道为什么你的map为何会是空值
h
haibinji
回复 @太黑的忧郁情怀 : 是在for语句块中的那一行,我已重新标注,谢谢。
h
haibinji
回复 @太黑的忧郁情怀 : if(map.containsKey("usedVrams") && map.containsKey("usedVbws") && map.containsKey("usedVsizes") && map.containsKey("usedVpesNumbers"))要是不加这句就会有空指针异常
h
haibinji
回复 @太黑的忧郁情怀 :我是强制判断了map的key不为null的,要是不判断,就会出现空指针异常
太黑_thj
太黑_thj
回复 @haibinji :这里不可能会空的 你是不是搞错了?哪怕这里的参数真空了 也不会抛空指针异常的
h
haibinji
回复 @丿不良人灬 : 帮忙看下吧,主要就是一个for循环往map里加入数据,一个for循环遍历集合,我标注了空指针异常的位置,代码写的很冗长,有待提高,谢谢。
下一页
0
学而不思则罔
学而不思则罔
你确定是map中的key为null报的空指针,这种异常很容易定位吧,打个断点一步步debug一下找到了。我肉眼看,可能报空指针的原因是hostUsedRes0、hostUsedRes1、hostUsedRes2、hostUsedRes3、hostUsedRes4中可能有为空的。也就是hostUsedRes0-4不为null但是size()==0。另外想问下楼主怎么觉得跟指令重排有关?
h
haibinji
回复 @学而不思则罔 : 非常感谢,最后是代码有问题,逻辑上有错误,改了后没错了,原来出现的问题之后再看看吧,我打印了List,list里的所有map都是有数据的,不知道怎么出现这种情况,好诡异。
学而不思则罔
学而不思则罔
回复 @haibinji : 没具体数据测试也测不了
学而不思则罔
学而不思则罔
回复 @haibinji : 我的意思是如果你的 Vector<MCT> temp = getSeqExcute();是空但不为null的时候,map的size就是空了,还有如果temp没有mct.hostIndex == 0那hostUsedRes0.size()也是0。但是你说判断了key是否存在就没空指针了不知道怎么出现这情况。
学而不思则罔
学而不思则罔
回复 @haibinji : 这个问题你这不存在,因为你的list已经初始化了List<HashMap<String, Integer>> list = new ArrayList<HashMap<String, Integer>>();
h
haibinji
使用增强型for循环时,对遍历的集合需要做null判断,不然可能引发空指针异常。网上搜了看到的多数是这个原因,为什么呢?
下一页
0
水梦星光
水梦星光
断点调试跟踪查看
返回顶部
顶部