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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 添加商品到购物车
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里面添加到购物车的部分代码在这里。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
5
6
7
8
9
10
11
12
13
14
**************************************************************
                 **购物车管理**
              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
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
*******************************
           **主菜单**
           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类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
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类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
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类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// 购物车中的商品信息类
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类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// 商品类
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

运行报错是这里

1
shoppingcart.addGoodsToCart(goodsmanage);

和这里

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

有问题。

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

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

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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