编程5-1,添加商品到购物车,死活写不出来,卡了半个多月了

编程5-1,添加商品到购物车,死活写不出来,卡了半个多月了

	// 添加商品到购物车
	public void addGoodsToCart(GoodsManage gm) {
		Scanner sc = new Scanner(System.in);
		if (gm.getGoodsSet().size() == 0) {
			System.out.println("请先添加商品信息!");
		} else {
			gm.displayAllGoods();
			boolean flag = false;
			Goods goodsg = null;
			System.out.println("请输入要添加的商品编号:");
			String goodsId = sc.next();
			
			Set<Goods> goods = gm.getGoodsSet();
			for(Goods g:goods) {
				if(g.getGoodsId().equals(goodsId)) {
					flag = true;
					goodsg = g;
					break;
				}
			}
			if(flag = true) {
				System.out.println("请输入要添加的商品数量:");
				int goodsNum = sc.nextInt();
				GoodsInCart gic = new GoodsInCart(goodsg, goodsNum);
				
			}
		}
		
		/*
		 * 添加购物车的方法中先判断商品是否导入,如果商品没有导入,则提示请先导入商品,
		 * 否则提示请输入要添加的商品编号,循环遍历导入的商品,判断输入商品编号是否存在,
		 * 如果存在则输入商品数量,并将商品添加到购物车,如果商品不存在,则提示商品不存在。
		 */
	}

我看了别人的提问中的代码,和老师给别人的回复,谢了这些。然而一运行,直接报空指针异常,求问老师给个指导。

我发现我集合那部分很弱,感觉从开始学集合到现在做题,遇到集合的只是基本上全是懵的状态,感觉像和集合处于两个平行世界一样,一直不想交不来电不知所措一见就晕。求老师指点。


TestDemo.java里面添加到购物车的部分代码在这里。

case 2: // 购物车
				test.shoppingcart();// 购物车管理1-2-3-4-9
				System.out.println("请输入对应的数字对购物车进行管理:");
				boolean flag_2 = true;
				while(flag_2) {
					int n_2 = sc.nextInt();
					switch(n_2) {
					case 1: // 添加商品到购物车
						System.out.println("添加商品到购物车");
						System.out.println("所有商品信息为:");
						goodsmanage.displayAllGoods(set); // 显示所有商品信息
						
						shoppingcart.addGoodsToCart(goodsmanage);
						
						break;
					case 2: // 修改购物车中的商品数量
						break;
					case 3: // 显示购物车中的所有商品信息
						break;
					case 4: // 结算
						break;
					case 9: // 
						break;
					default:
						break;
					}
				}

运行到添加购物车报错是这样子的

**************************************************************
                 **购物车管理**
              1--添加商品到购物车
              2--修改购物车中的商品数量
              3--显示购物车中的所有商品信息
              4--结算
              9--返回上一级菜单
**************************************************************
请输入对应的数字对购物车进行管理:
1
添加商品到购物车
Exception in thread "main" java.lang.NullPointerException
	at com.imooc.HomeWork4.ShoppingCart.addGoodsToCart(ShoppingCart.java:36)
	at com.imooc.HomeWork4.TestDemo.main(TestDemo.java:109)


正在回答

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

9回答

同学你好,首先GoodsManage类和ShoppingCart类中的goodsSet对象和shoppingCart对象需要初始化。如:

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

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

另外导入商品的importGoods()方法,不需要参数,应该是将商品导入到类中定义的goodsSet对象中,如:

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

显示所有商品信息的方法也不需要参数,在方法中应该遍历goodsSet对象。如:

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

同学修改一下再试试,如果还有问题,可以继续提问。祝:学习愉快~

  • 讓倪飛翔 提问者 #1
    真的把参数去掉就可以了,谢谢老师哦!!超级感谢,我终于可以往下继续写了!
    2019-02-12 16:14:08
提问者 讓倪飛翔 2019-02-12 15:32:42

运行出错结果:

*******************************
           **主菜单**
           1--商品管理
           2--购物车
           0--退出
*******************************
请输入对应数字进行操作:
1
**************************************************************
                 **商品管理**
              1--商品信息导入
              2--显示所有商品信息
              9--返回上一级菜单
**************************************************************
请输入对应的数字对商品进行管理:
1
商品信息导入
导入成功!
**************************************************************
                 **商品管理**
              1--商品信息导入
              2--显示所有商品信息
              9--返回上一级菜单
**************************************************************
请输入对应的数字对商品进行管理:
2
显示所有商品信息
所有商品信息为:
商品信息 [编号:goods004, 名称:手机, 价格:2300.0, 描述:android手机]
商品信息 [编号:goods002, 名称:饮水机, 价格:299.0, 描述:带净化功能的饮水机]
商品信息 [编号:goods003, 名称:笔记本电脑, 价格:4999.0, 描述:15寸笔记本电脑]
商品信息 [编号:goods001, 名称:水杯, 价格:56.0, 描述:不锈钢水杯]
**************************************************************
                 **商品管理**
              1--商品信息导入
              2--显示所有商品信息
              9--返回上一级菜单
**************************************************************
请输入对应的数字对商品进行管理:
9
*******************************
           **主菜单**
           1--商品管理
           2--购物车
           0--退出
*******************************
2
**************************************************************
                 **购物车管理**
              1--添加商品到购物车
              2--修改购物车中的商品数量
              3--显示购物车中的所有商品信息
              4--结算
              9--返回上一级菜单
**************************************************************
请输入对应的数字对购物车进行管理:
1
添加商品到购物车
所有商品信息为:
Exception in thread "main" java.lang.NullPointerException
	at com.imooc.HomeWork4.ShoppingCart.addGoodsToCart(ShoppingCart.java:37)
	at com.imooc.HomeWork4.TestDemo.main(TestDemo.java:109)
商品信息 [编号:goods004, 名称:手机, 价格:2300.0, 描述:android手机]
商品信息 [编号:goods002, 名称:饮水机, 价格:299.0, 描述:带净化功能的饮水机]
商品信息 [编号:goods003, 名称:笔记本电脑, 价格:4999.0, 描述:15寸笔记本电脑]
商品信息 [编号:goods001, 名称:水杯, 价格:56.0, 描述:不锈钢水杯]
9999999
gggyyyuuuuiiiooo


提问者 讓倪飛翔 2019-02-12 15:31:38

TestDemo.java类

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

import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils.Text;
// 测试类
public class TestDemo {
	// 主菜单方法
	public void action() {
		System.out.println("*******************************");
		System.out.println("           **主菜单**");
		System.out.println("           1--商品管理");
		System.out.println("           2--购物车");
		System.out.println("           0--退出");
		System.out.println("*******************************");		
	}
	// 商品管理方法1-2-9
	public void goodsmanage() {
		System.out.println("**************************************************************");
		System.out.println("                 **商品管理**");
		System.out.println("              1--商品信息导入");
		System.out.println("              2--显示所有商品信息");
		System.out.println("              9--返回上一级菜单");
		System.out.println("**************************************************************");			
	}
	// 购物车管理1-2-3-4-9
	public void shoppingcart() {
		System.out.println("**************************************************************");
		System.out.println("                 **购物车管理**");
		System.out.println("              1--添加商品到购物车");
		System.out.println("              2--修改购物车中的商品数量");
		System.out.println("              3--显示购物车中的所有商品信息");
		System.out.println("              4--结算");
		System.out.println("              9--返回上一级菜单");
		System.out.println("**************************************************************");			
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 将商品放入HashSet中
		Set<Goods> set = new HashSet<Goods>();
		// 商品管理
		GoodsManage goodsmanage = new GoodsManage();
		
		TestDemo test = new TestDemo();
		test.action(); // 主菜单方法
		// 购物车
		ShoppingCart shoppingcart = new ShoppingCart();
		// 购物车中商品信息

		System.out.println("请输入对应数字进行操作:");
		boolean flag = true;
		while(flag) {
			int n = sc.nextInt();
			switch(n) {
			case 0:
				flag = false;
				break;
			case 1: // 商品管理
				boolean flag_1 = true;
				while(flag_1) {
					test.goodsmanage(); // 商品管理方法1-2-9
					System.out.println("请输入对应的数字对商品进行管理:");
					int n_1 = sc.nextInt();
					switch(n_1) {
					case 1: // 商品信息导入
						System.out.println("商品信息导入");
						goodsmanage.importGoods(set); // 商品信息导入
//						//商品名与商品映射
//						Map<String,Goods> goodsmap = new HashMap<String,Goods>();
//						for(Goods goods : set){
//						   goodsmap.put(goods.getGoodsId(),goods);
//						}
//						
						System.out.println("导入成功!");
						break;
					case 2: // 显示所有商品信息
						System.out.println("显示所有商品信息");
						System.out.println("所有商品信息为:");
						goodsmanage.displayAllGoods(set); // 显示所有商品信息
						break;
					case 9:
						test.action(); // 主菜单方法
						flag_1 = false;
						break;
					default:
						System.out.println("请输入正确的数字!谢谢!");
						break;
					}
				}
				break;
			case 2: // 购物车
				test.shoppingcart();// 购物车管理1-2-3-4-9
				System.out.println("请输入对应的数字对购物车进行管理:");
				boolean flag_2 = true;
				while(flag_2) {
					int n_2 = sc.nextInt();
					switch(n_2) {
					case 1: // 添加商品到购物车
						System.out.println("添加商品到购物车");
						System.out.println("所有商品信息为:");
						goodsmanage.displayAllGoods(set); // 显示所有商品信息
						System.out.println("9999999");
						shoppingcart.addGoodsToCart(goodsmanage);
						System.out.println("---------------");
						break;
					case 2: // 修改购物车中的商品数量
						break;
					case 3: // 显示购物车中的所有商品信息
						break;
					case 4: // 结算
						break;
					case 9: // 
						break;
					default:
						break;
					}
				}
				
				break;
			default:
				break;
			}
		}
	}
}


提问者 讓倪飛翔 2019-02-12 15:31:14

ShoppingCart.java类

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

// 购物车类
public class ShoppingCart {

	// 属性:购物车
	private Map<String, GoodsInCart> shoppingCart;

	// 无参构造
	public ShoppingCart() {

	}

	// 带参构造
	public ShoppingCart(Map<String, GoodsInCart> shoppingCart) {
		super();
		this.shoppingCart = shoppingCart;
	}

	// getter和setter方法
	public Map<String, GoodsInCart> getShoppingCart() {
		return shoppingCart;
	}

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

	// 添加商品到购物车
	public void addGoodsToCart(GoodsManage gm) {
		System.out.println("gggyyyuuuuiiiooo");
		Scanner sc = new Scanner(System.in);
		if (gm.getGoodsSet().size() == 0) {
			System.out.println("请先添加商品信息!");
		} else {
			gm.displayAllGoods(null);
			boolean flag = false;
			Goods goodsg = null;
			System.out.println("请输入要添加的商品编号:");
			String goodsId = sc.next();
			
			Set<Goods> goods = gm.getGoodsSet();
			for(Goods g:goods) {
				if(g.getGoodsId().equals(goodsId)) {
					flag = true;
					goodsg = g;
					break;
				}
			}
			if(flag = true) {
				System.out.println("请输入要添加的商品数量:");
				int goodsNum = sc.nextInt();
				GoodsInCart gic = new GoodsInCart(goodsg, goodsNum);
				
			}
		}
		
		/*
		 * 添加购物车的方法中先判断商品是否导入,如果商品没有导入,则提示请先导入商品,
		 * 否则提示请输入要添加的商品编号,循环遍历导入的商品,判断输入商品编号是否存在,
		 * 如果存在则输入商品数量,并将商品添加到购物车,如果商品不存在,则提示商品不存在。
		 */
	}



	// 修改购物车中的商品数量
	public void updateNumInCart() {
		/*
		 * 修改购物车中的商品数量的方法中先判断购物车中是否存在商品。 不存在则提示请先添加商品到购物车,如果购物车已存在商品,则提示输入商品编号,
		 * 并判断输入的商品编号是否存在在购物车中,如果存在,则提示输入修改后的商品数量,
		 * 为0则移除商品,不为0则修改商品数量,如果商品编号不存在,则提示商品编号不存在, 请重新输入。
		 */

	}

	// 显示购物车中的所有商品
	public void displayAllInCart() {
		/*
		 * 显示购物车中所有的商品信息的方法中,先判断购物车是否为空,为空则提示购物车为空, 请先添加商品,不为空则循环显示购物车中的商品及数量。
		 */
	}

	// 结算
	public void settleAccounts() {
		/*
		 * 结算的方法中先判断购物车是否为空,为空则提示购物车为空,请先添加商品。 不为空,则遍历购物车中的商品及数量,计算商品价格和数量的乘积并输出。
		 */
	}
}


提问者 讓倪飛翔 2019-02-12 15:30:43

GoodsManage.java类

import java.util.Iterator;
import java.util.Set;
// 商品管理类
public class GoodsManage {
	
	private Set<Goods> goodsSet;
	
	// 无参构造
	public GoodsManage() {
		
	}
	// 带参构造
	public GoodsManage(Set<Goods> goodsSet) {
		super();
		this.goodsSet=goodsSet;
	}
	// getter和setter方法
	public Set<Goods> getGoodsSet() {
		return goodsSet;
	}
	public void setGoodsSet(Set<Goods> goodsSet) {
		this.goodsSet = goodsSet;
	}
	
	// 商品信息导入
	public void importGoods(Set<Goods> set) {
		// 定义商品信息
		Goods goods001 = new Goods("goods001","水杯",56,"不锈钢水杯");
		Goods goods002 = new Goods("goods002","饮水机",299,"带净化功能的饮水机");
		Goods goods003 = new Goods("goods003","笔记本电脑",4999,"15寸笔记本电脑");
		Goods goods004 = new Goods("goods004","手机",2300,"android手机");
		// 添加商品
		set.add(goods001);
		set.add(goods002);
		set.add(goods003);
		set.add(goods004);
	}
	// 显示所有商品信息
	public void displayAllGoods(Set<Goods> set) {
		Iterator<Goods> it = set.iterator();
		while(it.hasNext()) {
			System.out.println(it.next());
		}
	}
}


提问者 讓倪飛翔 2019-02-12 15:30:12

GoodsInCart.java类

// 购物车中的商品信息类
public class GoodsInCart {
	// 属性:商品信息、商品数量
	private Goods goods; // 商品信息
	private int num; // 数量
	
	// 无参构造
	public GoodsInCart() {

	}	
	// 带参构造
	public GoodsInCart(Goods goods, int num) {
		super();
		this.goods = goods;
		this.num = num;
	}
	// getter和setter方法
	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;
	}
}


提问者 讓倪飛翔 2019-02-12 15:29:29

Goods.java类

// 商品类
public class Goods {
	// 属性:商品编号、名称、价格、描述
	private String goodsId;
	private String goodsName;
	private double price;
	private String goodsDesp;

	// 无参构造
	public Goods() {

	}

	// 带参构造
	public Goods(String goodsId) {
		super();
		this.goodsId = goodsId;
	}
	public Goods(String goodsId, String goodsName, double price, String goodsDesp) {
		super();
		this.goodsId = goodsId;
		this.goodsName = goodsName;
		this.price = price;
		this.goodsDesp = goodsDesp;
	}

	// getter和setter方法
	public String getGoodsId() {
		return goodsId;
	}

	public void setGoodsId(String goodsId) {
		this.goodsId = goodsId;
	}

	public String getGoodsName() {
		return goodsName;
	}

	public void setGoodsName(String goodsName) {
		this.goodsName = goodsName;
	}

	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;
	}

	// hashCode()方法
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((goodsDesp == null) ? 0 : goodsDesp.hashCode());
		result = prime * result + ((goodsId == null) ? 0 : goodsId.hashCode());
		result = prime * result + ((goodsName == null) ? 0 : goodsName.hashCode());
		long temp;
		temp = Double.doubleToLongBits(price);
		result = prime * result + (int) (temp ^ (temp >>> 32));
		return result;
	}

	// equals()方法
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Goods other = (Goods) obj;
		if (goodsDesp == null) {
			if (other.goodsDesp != null)
				return false;
		} else if (!goodsDesp.equals(other.goodsDesp))
			return false;
		if (goodsId == null) {
			if (other.goodsId != null)
				return false;
		} else if (!goodsId.equals(other.goodsId))
			return false;
		if (goodsName == null) {
			if (other.goodsName != null)
				return false;
		} else if (!goodsName.equals(other.goodsName))
			return false;
		if (Double.doubleToLongBits(price) != Double.doubleToLongBits(other.price))
			return false;
		return true;
	}

	// toString()方法
	@Override
	public String toString() {
		return "商品信息 [编号:" + goodsId + ", 名称:" + goodsName + ", 价格:" + price + ", 描述:" + goodsDesp + "]";
	}
}


好帮手慕阿满 2019-02-12 15:25:41

建议同学将所有的代码贴上来方便我们查看问题所在,贴代码时,记得贴在回答中,选择代码语言。另外关于集合,建议同学再去学习一下。如果有不理解的地方,可以提问。祝:学习愉快~

  • 提问者 讓倪飛翔 #1
    老师,我已经把所有代码贴好了。贴在回复里,麻烦您帮忙指导下
    2019-02-12 15:32:13
  • 提问者 讓倪飛翔 #2
    主要问题就是不会添加商品到购物车。具体表现为看不懂ShoppingCart类,不知道private Map<String, GoodsInCart> shoppingCart;可以怎么做。 然后是我写了添加商品的代码,可是报空指针异常,请问是哪里不对了
    2019-02-12 15:34:42
提问者 讓倪飛翔 2019-02-12 14:12:14

运行报错是这里

shoppingcart.addGoodsToCart(goodsmanage);

和这里

		if (gm.getGoodsSet().size() == 0) {

有问题。

可是不懂。我首先判断是否已经添加过商品,哪里不对

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

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

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

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

在线咨询

领取优惠

免费试听

领取大纲

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