作业代码:函数调用一直有空指针异常到底是怎么回事,求大神解答,我要被他搞疯掉了

西红柿炒鸡蛋呀 哈尔滨佛学院 2019-11-17 04:28:09

package SYBG_2;
//简单的超市管理
class Goods{//商品类
private String name,producer;
private float price;
private int number;
Goods(String a,String b,float c,int d){//构造商品
name=a;
producer=b;
price=c;
number=d;
}
Goods(){//商品类的无参构造函数
name="";
producer="";
price=0;
number=0;
}
int Sale(int money,int num){//商品销售
if(money<price*num) {
System.out.print("余额不足!");
return 0;
}
if(num>number) {
System.out.print("商品不足!");
return 0;
}
else {
System.out.print("购买成功!");
number--;
}return 1;
}
int ShowMe() {//显示商品信息
System.out.print("商品名称\t"+"商品价格\t"+"商品产地"+"商品数量\n");
System.out.print(name +"\t"+price+"\t"+producer+"\t"+number+"\n");
return 1;
}
int Add(Goods goods) {//商品上架,个数加一
goods.number+=1;
return 1;
}
public String GetName() {
String n=name;
return n;
}
public void SetName(String n) {
name=n;
}
public String GetProducer() {
String p=producer;
return p;
}
public void SetProducer(String p) {
producer=p;
}
public float GetPrice() {
float p=price;
return p;
}
public void SetPrice(float p) {
price=p;
}
public int GetNumber() {
int n=number;
return n;
}
public void SetNumber(int num) {
number=num;
}
}

class Supermarket{
private Goods goods[];
private int GoodsNum;
public void Check() {//盘点各类商品的数量
System.out.print("商品名称\t商品数量\n");
for(int i=0;i<GoodsNum;i++) {
System.out.print(goods[i].GetName()+"\t"+goods[i].GetNumber()+"\n");
}
}
public Goods Query(String a) {//查询,根据商品名称或产地
int i=0;
for(;i<GoodsNum;i++) {
if(a==goods[i].GetName()||a==goods[i].GetProducer())
break;
}
if(i==GoodsNum-1)
System.out.print("查询不到该商品!");
return goods[i];
}

public Goods Query(float a) {//查询,根据价格
int n=0;
for(;n<GoodsNum;n++) {
if(a==goods[n].GetPrice())
break;
}
if(n==GoodsNum-1)
System.out.print("查询不到该商品!");
return goods[n];
}

public void Add(String a,String b,float c,int d) {
Goods goods_1=new Goods(a,b,c,d);
goods[++GoodsNum].SetName(goods_1.GetName());
}

public void Delete(String a) {//根据商品名称和产地来查询删除商品
int i=0;
for(;i<GoodsNum;i++) {
if(a==goods[i].GetName()||a==goods[i].GetProducer()) {
for(;i<GoodsNum;) {
goods[i]=goods[++i];
}
break;
}
}
}

public void Delete(float a) {//根据商品的价格来查询删除商品
int n=0;
for(;n<GoodsNum;n++) {
if(a==goods[n].GetPrice()) {
for(;n<GoodsNum;) {
goods[n]=goods[++n];
}
break;
}
}
}

public void Sale(String a,int money ,int num){//出售商品
Query(a).Sale(money, num);
}

Supermarket(){}//超市类的无参构造

Supermarket(Goods good[],int GoodsNum){//超市类的有参构造
this.GoodsNum=GoodsNum;
Goods goods[]=new Goods[GoodsNum];
for(int i=0;i<GoodsNum;i++) {
goods[i]=new Goods(good[i].GetName(),good[i].GetProducer(),good[i].GetPrice(),good[i].GetNumber());
/*this.goods[i].SetName(good[i].GetName());
this.goods[i].SetProducer(good[i].GetProducer());
this.goods[i].SetPrice(good[i].GetPrice());
this.goods[i].SetNumber(good[i].GetNumber());*/
}
}

public void PrintGoods(Goods goods) {
goods.ShowMe();
}
}

public class SYBG_2_4 {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Goods goods[]= { new Goods("牙膏","中国",20,88),
new Goods("火腿","中国",1,100),
new Goods("铅笔","中国",1,88),
new Goods("文具盒","中国",30,88),
};

Supermarket supm=new Supermarket(goods,4);
supm.Check();
supm.Add("手机", "中国",3000,30);
supm.Check();
supm.PrintGoods(supm.Query("牙膏"));
supm.PrintGoods(supm.Query("马桶"));
supm.Delete("铅笔");
supm.Check();
}
}
控制台显示为:
商品名称 商品数量
Exception in thread "main" java.lang.NullPointerException
at SYBG_2.Supermarket.Check(SYBG_2_4.java:78)
at SYBG_2.SYBG_2_4.main(SYBG_2_4.java:166)
...全文
55 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
谢谢各位的帮助,问题解决了
回复
IT_熊 2019-11-17
Exception in thread "main" java.lang.NullPointerException
at SYBG_2.Supermarket.Check(SYBG_2_4.java:78)
at SYBG_2.SYBG_2_4.main(SYBG_2_4.java:166)

都报错提示都指向了代码行,空指针异常排查是基本的能力,这个自己debug看下哪个变量为null,找下为什么没有对其进行实例化。。。
问题就解决了
回复
刚开始学Java,什么也不知道。。。。。
回复
debug一下
回复
class命名着急
回复
1. 数组声明建议

Goods[] goods = {}
2. 构造赋值

    Supermarket(Goods[] good,int GoodsNum){//超市类的有参构造
        this.GoodsNum=GoodsNum;
        this.goods = good;

还有其他问题
回复
完全不知道问题出在哪里
回复
发帖
非技术区
创建于2007-09-28

2.3w+

社区成员

Java 非技术区
申请成为版主
帖子事件
创建了帖子
2019-11-17 04:28
社区公告
暂无公告