前言
今天在学习Java中Session的时候,利用了Session可持久化保存服务器端的特性尝试做了一下用HashMap嵌套的购物车(没有将购物车的商品信息保存在数据库中),之所以做的这么麻烦是为了巩固之前学习的Map知识和锻炼逻辑能力,正好也在其中遇到了一个关于HashMap 的问题,在此做个小小的记录,方便日后查看。
问题
服务器端保存购物车商品信息用的是HashMap嵌套,内层HashMap存放的是商品和该商品的数量,内层的HashMap中只存放一组键值对,外层HashMap存放的是商品和该商品总价,根据页面传过来的商品id在数据库中获取到商品的信息,。再遍历HashMap根据id判断是否已经存在该商品,再针对不同情况进行处理,所遇到的问题是购物车存在页面穿进来的该商品,那么我如果修改内层Map的Integer(数量),再修改外层HashMap的Value(该商品的总价),就会出现空指针异常,解决方案是先将商品总价保存起来,把内层HashMap从外层HashMap中remove掉,再修改商品数量,再将修改数量后的内层HashMap添加到外层HashMap中,代码如下:
出错代码待添加
//此处写的是Shop是因为数据表中给定的表名是shop
package model;/**
- TODO
- @Author Whyat
- @Date 2019/1/9 17:10
/
public class Shop {
private int sid,price;
private String code,name,type; public Shop() {
} public Shop(int price, String code, String name, String type) {
this.price = price;
this.code = code;
this.name = name;
this.type = type;
} public Shop(int sid, int price, String code, String name, String type) {
this.sid = sid;
this.price = price;
this.code = code;
this.name = name;
this.type = type;
} public int getSid() {
return sid;
} public Shop setSid(int sid) {
this.sid = sid;
return this;
} public int getPrice() {
return price;
} public Shop setPrice(int price) {
this.price = price;
return this;
} public String getCode() {
return code;
} public Shop setCode(String code) {
this.code = code;
return this;
} public String getName() {
return name;
} public Shop setName(String name) {
this.name = name;
return this;
} public String getType() {
return type;
} public Shop setType(String type) {
this.type = type;
return this;
} @Override
public String toString() {
return “Shop{” +
“sid=” + sid +
“, price=” + price +
“, code=’” + code + ‘’’ +
“, name=’” + name + ‘’’ +
“, type=’” + type + ‘’’ +
‘}’;
}
}
结论
在Key嵌套HashMap的HashMap,如果修改已经存放的Key的内容时,再用修改后的外层Key去获取外层HashMap的Value,是会报空指针异常的。但是如果不是HashMap嵌套,这样做是不会出异常,以上结论仅根据做的简单的测试得出的,如有错误,望不吝赐教。
package servlet;import model.Good;
import model.Shop;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/* - TODO
- @Author Whyat
- @Date 2019/1/10 22:05
/
public class test {
public static void main(String[] args) {
//test1();
test2();
} /*- 修改map外面的key的内容内层的key的内容也会改变,
- 再用修改后的key去获得之前的value是可以的,
- 而且可以覆盖之前的键值对
/
private static void test1() {
Map<Shop, Integer> map = new HashMap<>();
Shop shop = new Shop(2, 3, “code”, “name”, “type”);
map.put(shop, 3);
shop.setSid(4);
int i = map.get(shop);
Set set = map.keySet();
for (Shop shop1 : set) {
System.out.println(shop1);
}
map.put(shop, 4);
System.out.println("…");
} /* - 修改外层的key,根据key获取外层的value会出现空指针异常
*/
private static void test2() {
Map<Map<Good,Integer>, Integer> bigMap = new HashMap<>();
Map<Good,Integer> smallMap = new HashMap<>();
Good good = new Good(1, “name”, “class”, 10, “code”); smallMap.put(good, 5);
bigMap.put(smallMap, 100);
//修改了内层小map的内容
smallMap.put(good, 6);
//大map再根据小map获取之前大map的value报空指针异常
int i = bigMap.get(smallMap);
bigMap.put(smallMap, i + 10);
System.out.println("…");
}
}
文章来自:https://www.itjmd.com/news/show-5342.html