java购物车系统遇到的问题

问题:代码只能执行一次"add"命令,然后就报错,找好久不知道问题在哪,望解答
报错图片:

img

代码如下

//商品类
public class Commodity {
    int id;
    String name;
    double price;
    int buynum;
    
}
//测试类
package shoppingCar;
import java.util.Scanner;

public class ShopcarTest {
    public static void main(String[] args)
    {
        
        Commodity[] shopCar=new Commodity[100];
        
        //操作架构
        while(true)
        {
            System.out.println("请选择如下命令进行操作");
            System.out.println("添加商品到购物车:add");
            System.out.println("查询商品到购物车: query");
            System.out.println("修改购买数量:update");
            System.out.println("结算商品:pay");
            
            System.out.println("输入指令:");
            Scanner input=new Scanner(System.in);
            String command=input.next();
            
            switch(command) {
            case "add":
            {
                addGoods(shopCar);
                for(int i=0;i<shopCar.length;i++)
                {
                    if(shopCar[i]!=null)
                    {
                        System.out.println(shopCar[i].id+"\t\t"+shopCar[i].name+"\t\t"+shopCar[i].price+"\t\t"+shopCar[i].buynum);
                    }
                    else
                    {
                        System.out.println("1");
                    }
                    break;
                }
            }
                
                break;
            case "query":
                queryGoods(shopCar);
                break;
            case "update":
                updateGoods(shopCar);
                break;
            case "pay":
                payGoods(shopCar);
                break;
                default:
                    break;
            
            }
            
        }
        
    }
//计算总价
    public static void payGoods(Commodity[] shopCar)
    {
        double pricesum=0;
        for(int i=0;i<shopCar.length;i++)
        {
            pricesum+=shopCar[i].price;
        }
        System.out.println("总金额:"+pricesum);
    }
//更改购买数量
    public static void updateGoods(Commodity[] shopCar)
    {
        Scanner input=new Scanner(System.in);
        int chagenum;
        int i;
        
        System.out.println("输入你要修改商品的名称");
        while(true)
        {
            int sig;
                String upname=input.next();
            for( i=0;i<shopCar.length;i++)
            {
                if(upname.equals(shopCar[i].name))
                {
                    chagenum=i;
                    System.out.println("输入修改数量");
                    int num1=input.nextInt();
                    shopCar[i].buynum=num1;
                    break;
                }
            }
            if(i==shopCar.length)
            {
                System.out.println("无该商品重新输入");
            }
        }
        
        
    }
    //查询商品
    public static void queryGoods(Commodity[] shopCar)
    {
        System.out.println("商品id\t\t商品姓名\t\t商品价格\t\t购买数量\t\t");
        for(int i=0;i<shopCar.length;i++)
        {
            if(shopCar[i]!=null)
            {
                System.out.println(shopCar[i].id+"\t\t"+shopCar[i].name+"\t\t"+shopCar[i].price+"\t\t"+shopCar[i].buynum);
            }
            else
            break;
        }
    }
    //添加商品
    public static void addGoods(Commodity[] shopCar)
    {
        Scanner input=new Scanner(System.in);
        System.out.println("请输入商品的编号");
        
        
        int num;
        //检查编号是否重复
        while(true)
        {
             num=input.nextInt();
                int i;
            
                for( i=0;i<shopCar.length;i++)
                {
                    if(shopCar[i]!=null)
                    {
                        if(num==shopCar[i].id)
                        {
                            System.out.println("编号重复");
                            break;
                        }
                    }
                    
                }
                if(i==shopCar.length)
                    break;
            
        }
            
        
        System.out.println("输入商品的名称:");
        String name1=input.next();
        
        System.out.println("输入商品的价格");
        double price1=input.nextDouble();
        
        System.out.println("输入商品购买数量");
        int num1=input.nextInt();
        
        input.close();
        
        Commodity g=new Commodity();
        g.id=num;
        g.buynum=num1;
        g.name=name1;
        g.price=price1;
        
        
        
        for(int j=0;j<shopCar.length;j++)
        {
            if(shopCar[j]==null)
            {
                shopCar[j]=g;
                break;
            }
        }
        System.out.println("添加成功");
        
    }

}



你的 addGoods 方法里面执行了input.close,这个方法执行的时候会讲传入的System.in也给关闭了,所以在你再次new Scanner,也无法打开System.in,所以获取输入的时候就获取不到值了。
建议:
input 改成成员变量,全局使用这一个,也不用专门去关闭这个Scanner了,因为程序结束流会自动回收的。

Scanner的close()方法会关闭System.in,也就是Scanner对象被初始化时所传入的参数,System.in是一个final常量 只能初始化一次,一旦初始化后就不能被赋值。


        // 可以将164行的这个代码注释掉。
        input.close();