java基础:ArrayList的使用,求解答

Tony2016liang 2016-08-14 05:44:31
本人正在学java的新手一枚,刚学过集合框架部分,还没弄太明白,然后之前的泛型也是有些糊涂。问题如下:
我们现在要做一个小收银系统,其中会员卡管理部分需要用ArrayList来做,里面还用到了泛型接口,我先做了一个增加的功能,但测试出来却总是空指针异常,求高手解答,多谢!部分代码如下:
1、会员实体类:
public class Person {
private String personName;
private String cardId;
private String cardType;
private int scoreAll;//默认为0
private int scorePer;
private double cardDiscount;

2.管理类:
public class PersonManage<Person> implements Operate<Person> {
private Person person;
private ArrayList<Person> pm ;

public PersonManage() {
super();
new ArrayList<Person>();
}

public ArrayList<Person> getPm() {
return pm;
}

public void setPm(ArrayList<Person> pm) {
this.pm = pm;
}

@Override
public void add(Person person) {

pm.add(person);
}

@Override
public void delete(Person person) {
pm.remove(person);
}

@Override
public void change(Person person) {
pm.set(pm.indexOf(person), person);
}

@Override
public void show() {
person.toString();
}

}


3、泛型接口:
public interface Operate<T> {
public void add(T t);
public void delete(T t);
public void change(T t);
public void show();
}

4、系统主界面部分:参数都是通过Scanner键盘输入的
pm=new PersonManage<Person>();
pm.add(new Person(personName,cardId,cardType,scoreAll,scorePerOne,cardDiscount));
pm.show();

然后测试出来就是:java.lang.NullPointerException


实在不知道问题出在哪儿了?求大神帮解答,谢谢!
...全文
708 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
NewMoons 2016-08-17
  • 打赏
  • 举报
回复
现在很多培训的老师都只是授人以鱼而不是授人以渔,所以让这些学生总是事倍功半,唉......
心想事成All 2016-08-17
  • 打赏
  • 举报
回复
看了一下楼主的代码,的确错误一大推,很多地方的对象没有初始化就直接调用方法,但是楼主要学会看错误,报空指针异常的时候一般下面会有错误具体地方,楼主点进去就行了,比如这边一个错误: Exception in thread "main" java.lang.NullPointerException at mytest.GoodsManage.show(GoodsManage.java:39) at mytest.MainSystem.startSystem(MainSystem.java:69) at mytest.MainSystem.returnStart(MainSystem.java:20) at mytest.MainSystem.startSystem(MainSystem.java:57) at mytest.MainSystem.returnStart(MainSystem.java:20) at mytest.TestMain.main(TestMain.java:8) 那么很明显,直接点进去GoodsManage.show的39行就知道是那里空指针了,一般错误信息都会在控制台打印出来的,直接告诉你哪里错了的。 另外,楼主也可以自己百度一下单步调式,即单步debug模式,一步一步按着代码走就知道哪里报错了,作为程序员,会自己发现错误在将来是很重要的一项能力哦。
lzl1030152809 2016-08-14
  • 打赏
  • 举报
回复
可能会有影响
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
这个有影响吗?效果应该是一样的吧?
lzl1030152809 2016-08-14
  • 打赏
  • 举报
回复
returnStart(); // 可以放到 switch 后面。 switch 分支没有 break。
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
刚才又改了一下,show的问题勉强解决了。 PM和GM多次创建的问题,是因为我一开始的时候觉得buy和pay的动作都比较复杂,就单独摘出来封装到了一个类里面,但是没想到这样以来就要创建这些对象才能完成这个动作。 唉,不管了,先交了这个半成品吧,没时间了。 感谢各位的热心帮助,多谢了! 不过这个东西还是要继续搞搞的,虽然老师后面还会讲,但不自己搞清楚还是不甘心啊
lzl1030152809 2016-08-14
  • 打赏
  • 举报
回复
程序中多次创建 PersonManage 与GoodsManage 对象,应该只在 MainSystem 中创建一次对象。
lzl1030152809 2016-08-14
  • 打赏
  • 举报
回复

pm = new PersonManage();
pm.add(new Person(personName, cardId, cardType, scoreAll, scorePerOne, cardDiscount));
pm.show();
这里你是想输出刚才添加的会员信息,应该是初始化一个 Person 对象,然后展示
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
Person类的无参构造方法是我后来加上去的,因为这个系统的参数都是靠键盘输入的,不这样我不懂怎么初始化 show方法好像确实有问题,我试一下
lzl1030152809 2016-08-14
  • 打赏
  • 举报
回复

public class PersonManage implements Operate<Person> {
    private Person person=new Person(); // Person 类没有无参构造方法
lzl1030152809 2016-08-14
  • 打赏
  • 举报
回复
show 方法里应该是对 ArrayList 进行循环输出。
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
刚根据17楼Forever1111a大神的意见改了一下,第一个功能总算不是空指针了,但到第二个功能又是空指针了,真是。。。 不过我似乎受到了点启发,自己再研究研究先,还是要谢谢Forever1111a大神,
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
会员管理类:
public class PersonManage implements Operate<Person> {
	private Person person=new Person();
	private ArrayList<Person> pm ;

	public PersonManage() {
		super();
		pm=new ArrayList<Person>();
	}

	public ArrayList<Person> getPm() {
		return pm;
	}

	public void setPm(ArrayList<Person> pm) {
		this.pm = pm;
	}

	@Override
	public void add(Person person) {
		
		pm.add(person);
	}

	@Override
	public void delete(Person person) {
		pm.remove(person);
	}

	@Override
	public void change(Person person) {
		pm.set(pm.indexOf(person), person);
	}

	@Override
	public void show() {
		person.toString();
	}

}
购买和结算类:
public class BuyAndPay {
	private GoodsManage gm;
	private Goods goods;
	private int amount;
	private double money;
	private String personId;
	private PersonManage pm= new PersonManage();
	private boolean flag;
	HashMap<Goods, Integer> map = new HashMap<Goods, Integer>();

	public void returnBuy() {
		String choice = input.next();
		while (choice.equals("y")) {
			buy();
		}
		System.exit(0);
	}

	Scanner input = new Scanner(System.in);
	
	public void buy() {
		System.out.println("是否会员(y/n):");
		String answer = input.next();
		if(answer.equals("y")){
			System.out.println("请输入会员卡编号:");
			String personId= input.next();
			flag=true;
		}
		System.out.println("请输入商品编号:");
		String goodsId = input.next();
		gm = new GoodsManage<Goods>();
		for (int i = 0; i < gm.getGm().size(); i++) {
			if (!goodsId.equals(((Goods) gm.getGm().get(i)).getGoodsId())) {
				throw new IllegalArgumentException();
			} else {
				goods = (Goods) gm.getGm().get(i);
				gm.show();
			}
		}
		System.out.println("请输入购买数量:");
		int amount = input.nextInt();
		if (amount == 0) {
			throw new IllegalArgumentException();
		} else {
			map.put(goods, amount);
		}
		System.out.println("是否继续购物(y/n):");
		returnBuy();
	}
	
	public void pay(){
		System.out.println("商品名称\t"+"商品数量\t"+"折后单价\t"+"金额\t");
		Set<Entry<Goods, Integer>> entrys = map.entrySet();
		for(Entry<Goods, Integer>  entry:entrys){
			double price=entry.getKey().getPrice()*entry.getKey().getPriceDiscount();
			System.out.println(entry.getKey().getGoodsName()+"\t"+amount+"\t"+price+"\t"+price*amount);
			money+=price*amount;
		}
		
		System.out.println("总金额:\t"+"   \t"+"   \t"+money);
		double trueMoney=0;
		double discount=0;
		if(flag){
			for (int i = 0; i < pm.getPm().size(); i++) {
				if (personId.equals(pm.getPm().get(i).getCardId())) {
					discount=pm.getPm().get(i).getDiscount();
					trueMoney=discount*money;
					break;
				}
			}
			System.out.println("会员卡折扣:\t"+"   \t"+"   \t"+discount);
			System.out.println("实际金额:\t"+"   \t"+"   \t"+trueMoney);
		}
		System.out.println("实际付款:");
		double payMoney=input.nextDouble();
		System.out.println("找零:"+(payMoney-trueMoney));
		
	}

}
主控制系统类:
public class MainSystem {
	Scanner input = new Scanner(System.in);

	private PersonManage pm;
	private GoodsManage<Goods> gm;
	private BuyAndPay bap = new BuyAndPay();

	public void returnStart() {
		int num = input.nextInt();
		while (num == 0) {
			startSystem();
		}
	}

	public void startSystem() {

		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("5.开始购物");
		System.out.println("6.结束购物并结算");
		System.out.println("7.退出");
		System.out.println("------------------------------------");
		System.out.print("请选择:");
		int choice = input.nextInt();
		switch (choice) {
			case 1 :
				System.out.println("请输入会员姓名:");
				String personName = input.next();
				System.out.println("请输入会员卡编号:");
				String cardId = input.next();
				System.out.println("请输入会员卡类型:");
				String cardType = input.next();
				System.out.println("请输入会员卡总积分:");
				int scoreAll = input.nextInt();
				System.out.println("请输入会员卡每消费一块钱所得积分数:");
				int scorePerOne = input.nextInt();
				System.out.println("请输入会员卡享受折扣:");
				double cardDiscount = input.nextDouble();
				pm = new PersonManage();
				pm.add(new Person(personName, cardId, cardType, scoreAll,
						scorePerOne, cardDiscount));
				pm.show();
				System.out.print("输入0返回:");
				returnStart();
			case 2 :
				System.out.println("请输入商品编号:");
				String goodsId = input.next();
				System.out.println("请输入商品名称:");
				String goodsName = input.next();
				System.out.println("请输入商品单价:");
				double price = input.nextDouble();
				System.out.println("请输入单价折扣:");
				double priceDiscount = input.nextDouble();
				gm = new GoodsManage<Goods>();
				gm.add(new Goods(goodsId, goodsName, price, priceDiscount));
				gm.show();
				System.out.print("输入0返回:");
				returnStart();
			case 3 :
				System.out.println("请输入会员卡编号:");
				String personId = input.next();
				for (int i = 0; i < pm.getPm().size(); i++) {
					if (personId.equals(pm.getPm().get(i).getCardId())) {
						pm.show();
					}
				}
				System.out.print("输入0返回:");
				returnStart();
			case 4 :
				System.out.println("请输入商品编号:");
				String productId = input.next();
				for (int i = 0; i < gm.getGm().size(); i++) {
					if (productId.equals(gm.getGm().get(i).getGoodsId())) {
						gm.show();
					}
				}
				System.out.print("输入0返回:");
				returnStart();
			case 5 :
				bap.buy();
				System.out.print("输入0返回:");
				returnStart();
			case 6 :
				bap.pay();
				System.out.print("输入0返回:");
				returnStart();
			case 7 :
				System.exit(0);
		}

	}
}
测试类就不贴了。还有好多细节需要完善的,但我首先需要的就是先运行起来,然后才能看有哪儿要完善的
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
我不知道CSDN原来是不允许连续回复3次以上的,所以刚才传了3个就传不上去了,接下来是下面的 商品管理类:
public class GoodsManage<Goods> implements Operate<Goods> {
	private Goods goods;
	private ArrayList<Goods> gm ;

	public GoodsManage() {
		super();
		gm = new ArrayList<Goods>();
	}

	public ArrayList<Goods> getGm() {
		return gm;
	}

	public void setGm(ArrayList<Goods> gm) {
		this.gm = gm;
	}

	@Override
	public void add(Goods person) {
		gm.add(person);
	}

	@Override
	public void delete(Goods person) {
		gm.remove(person);
	}

	@Override
	public void change(Goods person) {
		gm.set(gm.indexOf(person), person);
	}

	@Override
	public void show() {
		goods.toString();
	}

}
lzl1030152809 2016-08-14
  • 打赏
  • 举报
回复

@Override
public void show() {
    person.toString(); // 这个没有初始化
}
weixin_35722556 2016-08-14
  • 打赏
  • 举报
回复
代码补全,你接口实现部分呢
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
泛型接口:
public interface Operate<T> {
	public void add(T t);
	public void delete(T t);
	public void change(T t);
	public void show();
}
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
会员类:
public class Person {
	private String personName;
	private String cardId;
	private String cardType;
	private int scoreAll;//默认为0
	private int scorePer;
	private double cardDiscount;
	public Person(String personName, String cardId, String cardType, int scoreAll,
			int scorePer, double discount) {
		super();
		this.personName = personName;
		this.cardId = cardId;
		this.cardType = cardType;
		this.scoreAll = scoreAll;
		this.scorePer = scorePer;
		this.cardDiscount = discount;
	}
	public String getName() {
		return personName;
	}
	public void setName(String personName) {
		this.personName = personName;
	}
	public String getCardId() {
		return cardId;
	}
	public void setCardId(String cardId) {
		this.cardId = cardId;
	}
	public String getCardType() {
		return cardType;
	}
	public void setCardType(String cardType) {
		this.cardType = cardType;
	}
	public int getScoreAll() {
		return scoreAll;
	}
	public void setScoreAll(int scoreAll) {
		this.scoreAll = scoreAll;
	}
	public int getScorePer() {
		return scorePer;
	}
	public void setScorePer(int scorePer) {
		this.scorePer = scorePer;
	}
	public double getDiscount() {
		return cardDiscount;
	}
	public void setDiscount(double discount) {
		this.cardDiscount = discount;
	}
    @Override
    public String toString() {
    	return cardId+"\t"+personName+"\t"+scoreAll+"\t"+cardDiscount;
    }
}
Tony2016liang 2016-08-14
  • 打赏
  • 举报
回复
商品类:
public class Goods {
	private String goodsId;
	private String goodsName;
	private double price;
	private double priceDiscount;
	public Goods(String goodsId, String goodsName, double price,
			double priceDiscount) {
		super();
		this.goodsId = goodsId;
		this.goodsName = goodsName;
		this.price = price;
		this.priceDiscount = priceDiscount;
	}
	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 double getPriceDiscount() {
		return priceDiscount;
	}
	public void setPriceDiscount(double priceDiscount) {
		this.priceDiscount = priceDiscount;
	}
    @Override
    public String toString() {
    	return goodsId+"\t"+goodsName+"\t"+price;
    }
}
lzl1030152809 2016-08-14
  • 打赏
  • 举报
回复
pm.add(); 是往 List 中添加,pm.show() 是展示 person,看代码是都没有初始化。
加载更多回复(11)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧