請問 我的 修改商品數量的方法要怎麼改寫才不會發生空指針

請問 我的 修改商品數量的方法要怎麼改寫才不會發生空指針

//測試主體
package com.imooc.test;

import java.util.Scanner;

import com.imooc.model.GoodsInCart;
import com.imooc.model.GoodsMange;
import com.imooc.model.ShoppingCart;

public class TestDemo
{
	public static void main(String[] args)
	{
		boolean button1 = true;
		boolean button2 = true;
		boolean button3 = true;
		
		ShoppingCart shopCart=new ShoppingCart();
		Scanner input = new Scanner(System.in);
		GoodsMange gM = new GoodsMange();

		int menu1 = 0;
		int menu2 = 0;

		while (button1)
		{
			
			
			button2=true;
			button3=true;
			System.out.println("**************");
			System.out.println("menu");
			System.out.println("1.商品管理");
			System.out.println("2.購物車");
			System.out.println("0.退出");
			System.out.println("**************");
			System.out.println("輸入對應數字");
			try
			{
				menu1 = input.nextInt();
			} catch (Exception e)
			{
				System.out.println("請輸入整數");
				input.next();
				continue;
			}

			switch (menu1)
			{
			case 1:
			{
				while (button2)
				{
					
					System.out.println("商品管理");
					System.out.println("1.商品訊息導入");
					System.out.println("2.顯示商品訊息");
					System.out.println("9.返回");
					System.out.println("輸入對應數字");
					try
					{
						menu2 = input.nextInt();
					} catch (Exception e)
					{
						System.out.println("請輸入整數");
						input.next();
						continue;
					}
					switch (menu2)
					{
					case 1:
					{
						gM.importGoods();

						break;
					}
					case 2:
					{
						gM.displayAllGoods();
						break;
					}
					case 9:
					{
						button2=false;
						break;
					}
					default:
					{
						System.out.println("輸入錯誤請重新輸入對應數字");
					}
					}
					
				}
				break;
			}

			case 2:
			{

				while (button3)
				{
					System.out.println("購物車管理");
					System.out.println("1.添家商品到購物車");
					System.out.println("2.修改購物車商品數量");
					System.out.println("3.顯示購物車中所有商品");
					System.out.println("4.結算");
					System.out.println("9.返回");
					try
					{
						menu2 = input.nextInt();
					} catch (Exception e)
					{
						System.out.println("請輸入整數");
						input.next();
						continue;
					}
					switch (menu2)
					{
					case 1:
					{
						shopCart.addGoodsToCart(gM);
						break;
					}
					case 2:
					{
						shopCart.updateNumInCart();
						break;
					}
					case 3:
					{
						shopCart.displayAllInCart();
						break;
					}
					case 4:
					{
						shopCart.settleAccounts();
						
						break;
					}

					case 9:
					{
						button3=false;
						break;
					}
					default:
					{
						System.out.println("輸入錯誤請重新輸入對應數字");
					}
					}
				}

				break;
			}
			case 0:
			{
				button1 = false;
				break;
			}
			default:
			{
				System.out.println("輸入錯誤請重新輸入對應數字");
			}
			}

		}
	}
}
//購物車
package com.imooc.model;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class ShoppingCart
{
	private Map<String, GoodsInCart> shoppingCart = new HashMap<String, GoodsInCart>();
	Scanner input = new Scanner(System.in);

	public ShoppingCart()
	{
	}

	public ShoppingCart(Map<String, GoodsInCart> shoppingCart)
	{
		this.shoppingCart = shoppingCart;
	}

	public Map<String, GoodsInCart> getShoppingCart()
	{
		return shoppingCart;
	}

	public void setShoppingCart(Map<String, GoodsInCart> shoppingCart)
	{
		this.shoppingCart = shoppingCart;
	}

	// 添家商品到購物車裡
	/**
	 * @addGoodsToCart 加入商品到購物車裡
	 * @param gm
	 *            導入商品列表gm
	 */
	public void addGoodsToCart(GoodsMange gm)
	{
		// 把商品存到set
		Set<Goods> set = gm.getGoodsSet();
		String a = null;
		boolean flag = false;
		Goods goods = null;
		int num = 0;
		// 如果商品列表的長度==0的話代表gm集合中沒有商品列
		if (gm.getGoodsSet().size() == 0)
		{
			System.out.println("無商品表");
		}

		else
		{
			// 先秀出商品列表
			gm.displayAllGoods();
			// 開始輸入要購買的編號
			System.out.println("請輸入要購買的編號:");
			a = input.next();
			// 利用for強化迴圈進行掃描
			for (Goods o : set)
			{
				// 如果有跟鍵盤輸入編號一樣的話
				if (o.getGoodsId().equals(a))
				{
					// 開啟外部購買數量flag開關
					flag = true;
					// 把"o"附值到goods類方便HashMap集合使用
					goods = o;
					// 跳出迴圈
					break;

				}

			}
		}

		// 如果flag=true開啟數量開關
		if (flag)
		{
			System.out.println("請輸入要購買的數量:");
			// 使用try catch 防止輸入數字以外的輸入
			try
			{
				num = input.nextInt();
			} catch (Exception e)
			{
				System.out.println("請輸入整數");
				input.next();
			}
			// 使用 GoodsInCart 來封裝 "goods 商品以及 數量"方便 map類的shoppingCart 來使用
			GoodsInCart gic = new GoodsInCart(goods, num);
			// shoppingCart.put(K,V)
			this.shoppingCart.put(a, gic);
		} else
		{
			System.out.println("無此商品");
		}

	}

	/**
	 * @displayAllInCart() 顯示購物車裡面的商品
	 */
	public void displayAllInCart()
	{
		// 如果HashMap類的shoppingCart 商品長度 >0的話往下執行
		if (shoppingCart.size() > 0)
		{
			// 創建一個迭代器 it 用while 迴圈來執行商品輸出
			Iterator<GoodsInCart> it = shoppingCart.values().iterator();
			while (it.hasNext())
			{
				// 使用附值轉換(拆箱) shoppingCart(map(k(商品編號),v(GoodsInCart gic)))->Iterator ->
				// GoodsInCart(商品,數量)-> Goods 在使用goods 來讀取裡面的值
				System.out.println("商品訊息");
				GoodsInCart gic = it.next();
				Goods g = gic.getGoods();
				System.out.println("商品編號:" + g.getGoodsId() + ",商品名稱:" + g.getGoodName() + ",商品價格:" + g.getPrice()
						+ ",商品介紹:" + g.getGoodsDesp()+",商品數量:"+gic.getNum());

			}
		}
	}

	/**
	 * @settleAccounts 結算
	 */
	public void settleAccounts()
	{
		double sum = 0;
		if (shoppingCart.size() <= 0)
		{
			System.out.println("購物車內無商品不可結算");
		} else
		{

			Set<String> set = shoppingCart.keySet();
			for (String key : set)
			{
				sum = sum + (shoppingCart.get(key).getGoods().getPrice()) * (shoppingCart.get(key).getNum());

			}
			System.out.println("總金額為:" + sum);

		}
	}
/**
 * @updateNumInCart() 修改商品數量
 */
	public void updateNumInCart()
	{
		Set<String> set =shoppingCart.keySet();
		String s=null;
		int n=0;
		for(String str:set)
		{
			System.out.println("要修改的編號:");
			s=input.next();
			if(str.equals(s))
			{
				System.out.println("商品數量:");
				n=input.nextInt();
				if(n==00)
				{
					shoppingCart.remove(str);
				}
				shoppingCart.get(set).setNum(n);
			}
		}
	}
}
//購物車數量
package com.imooc.model;

public class GoodsInCart
{
	private Goods goods;
	private int num;
	public GoodsInCart()
	{
		
	}
	public GoodsInCart(Goods goods, int num)
	{
		this.setGoods(goods);
		this.setNum(num);
	}
	public Goods getGoods()
	{
		return goods;
	}
	public void setGoods(Goods goods)
	{
		this.goods = goods;
	}
	public int getNum()
	{
		return num;
	}
	public void setNum(int num)
	{
		this.num = num;
	}
	
	
}
//商品類
package com.imooc.model;

public class Goods
{
	private String goodsId;
	private String goodName;
	private double price;
	private String goodsDesp;
	public Goods()
	{
		
	}
	public Goods(String goodsId, String goodName, double price, String goodsDesp)
	{
		this.setGoodsId(goodsId);
		this.setGoodName(goodName);
		this.setPrice(price);
		this.setGoodsDesp(goodsDesp);
	}
	public String getGoodsId()
	{
		return goodsId;
	}
	public void setGoodsId(String goodsId)
	{
		this.goodsId = goodsId;
	}
	public String getGoodName()
	{
		return goodName;
	}
	public void setGoodName(String goodName)
	{
		this.goodName = goodName;
	}
	public double getPrice()
	{
		return price;
	}
	public void setPrice(double price)
	{
		this.price = price;
	}
	public String getGoodsDesp()
	{
		return goodsDesp;
	}
	public void setGoodsDesp(String goodsDesp)
	{
		this.goodsDesp = goodsDesp;
	}
	@Override
	public int hashCode()
	{
		final int prime = 31;
		int result = 1;
		result = prime * result + ((goodName == null) ? 0 : goodName.hashCode());
		result = prime * result + ((goodsDesp == null) ? 0 : goodsDesp.hashCode());
		result = prime * result + ((goodsId == null) ? 0 : goodsId.hashCode());
		long temp;
		temp = Double.doubleToLongBits(price);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		return result;
	}
	@Override
	public boolean equals(Object obj)
	{
		if(this==obj)
		{
			return true;
		}
		if(obj.getClass()==Goods.class)
		{
			Goods goods=(Goods)obj;
			return (goods.getGoodsId().equals(goodsId));
		}
		
		return false;
	}
	public String toString()
	{
		return "商品編號:"+this.getGoodsId()+"  商品名稱:"+this.getGoodName()+"  商品售價:"+this.getPrice()
		+"  商品介紹:"+this.getGoodsDesp();
	}
}
//商品管理
package com.imooc.model;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;

public class GoodsMange
{
	Scanner input = new Scanner(System.in);
	private Set<Goods> goodsSet = new HashSet<Goods>();

	public GoodsMange()
	{

	}

	public GoodsMange(Set<Goods> goodsSet)
	{
		this.setGoodsSet(goodsSet);
	}

	public Set<Goods> getGoodsSet()
	{
		return goodsSet;
	}

	public void setGoodsSet(Set<Goods> goodsSet)
	{
		this.goodsSet = goodsSet;
	}

	public void importGoods()
	{

		double goodsPrice = 0;
		boolean button = true;
		boolean button1 = true;

		int a = 0;
		Goods goods1 = new Goods("a01", "手機", 200, "手機");
		Goods goods2 = new Goods("a02", "電線", 200, "電線");
		Goods goods3 = new Goods("a03", "電", 200, "電");
		Goods goods4 = new Goods("a04", "手", 200, "手");
		goodsSet.add(goods1);
		goodsSet.add(goods2);
		goodsSet.add(goods3);
		goodsSet.add(goods4);
		System.out.println("導入成功");

	}

	public void displayAllGoods()
	{
		Iterator<Goods> it = goodsSet.iterator();
		while (it.hasNext())
		{
			System.out.println(it.next());
		}
		System.out.println();
	}

}

在 執行到 商品數量修改時候

購物車方法 169行 就跳出空指針錯誤

請問該怎麼改寫才不會發生??

正在回答

登陆购买课程后可参与讨论,去登陆

4回答

http://img1.sycdn.imooc.com//climg/5ad9c2e70001386e05600301.jpg

建议同学将输入修改编号的代码写到循环外面;

另外获取shoppingCart中的某个商品,应该是get(key)也就是str。

祝学习愉快!

提问者 慕后端1192210 2018-04-20 18:00:39

http://img1.sycdn.imooc.com//climg/5ad9ba190001482313170554.jpg

還是一樣

一叶知秋519 2018-04-20 16:30:08

http://img1.sycdn.imooc.com//climg/5ad9a5000001ab5603190101.jpg

remove之后,增加一个break语句试下~~~

  • 提问者 慕后端1192210 #1
    添加break 與語句後還是一樣跳出空指針
    2018-04-20 17:59:30
提问者 慕后端1192210 2018-04-20 15:00:41

抱歉 172行才對                 shoppingCart.get(set).setNum(n); 發生空指針

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师