1. 程式人生 > >在做商城專案實現購物車功能的時候除了個小bug...

在做商城專案實現購物車功能的時候除了個小bug...

@Autowired 
	private ItemService itemService;
	@Value("${COOKIE_CART_EXPIRE}")
	private int COOKIE_CART_EXPIRE;
	@Autowired 
	private CartService cartService;

	@RequestMapping("/cart/add/{itemId}")
	//響應一個頁面,所以用String
	public String addToCart(@PathVariable Long itemId,@RequestParam(defaultValue="1")Integer num,
			HttpServletRequest request,HttpServletResponse response) {
		//判斷使用者是不是登陸
		TbUser user = (TbUser) request.getAttribute("user");
		if(user!=null){
			//登陸了的話,儲存到服務端,返回邏輯檢視
			cartService.addCart(user.getId(), itemId, num);
			return "cartSuccess";
		}
		//未登陸
		//從cookie中取購物車列表
		List<TbItem> cartList = getCartListFromCookie(request);
		//判斷商品在商品購物車列表中是不是存在
		boolean flag = false;
		if(cartList!=null){
			flag=true;
		}/////待會加點程式碼在這裡
		//如果存在,就數量相加
		if(flag) {
			for(TbItem tbItem:cartList) {
				if(tbItem.getId()==itemId.longValue()) {
					//找到商品,數量相加
					tbItem.setNum(tbItem.getNum()+num);
					break;
				}
			}
		}
		
		//如果不存在,那就商品id查詢商品資訊,得到一個TbItem物件
		if(!flag) {
			TbItem tbItem = itemService.getItemById(itemId);
			String image=null;
				//數量要換
			tbItem.setNum(num);
				//取一張圖
			image = tbItem.getImage();
			if(StringUtils.isNotBlank(image)) {
				tbItem.setImage(image.split(",")[0]);
			}
			//把商品新增到商品購物車列表
			cartList.add(tbItem);
		}

		//商品購物車列表寫入cookie
		CookieUtils.setCookie(request, response,"cart", JsonUtils.objectToJson(cartList),COOKIE_CART_EXPIRE,true);
		//返回成功頁面

		return "cartSuccess";
	}

Servlet.service() for servlet [e3-cart-web] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause  java.lang.NullPointerException

at cn.e3mall.cart.controller.CartController.addToCart(CartController.java:80)

就是這個位置報了個空指標錯誤,我就一路找回去,發現邏輯上是有點不對,如果查到的cookie中的商品列表是空的也就是說List<TbItem>  cartList =null;這個時候我是不可以給這個cartList 新增任何東西的,必須要先給他一個空集合才可以新增商品。

所以我在上面判斷加了一句:

else {             cartList=new ArrayList<TbItem>();         }

將cartList初始化再來加商品,就可以運行了。