Java代码编译不通过

问题遇到的现象和发生背景

为什么编译不通过?谢谢帮助!

问题相关代码,请勿粘贴截图
import java.lang.System;
import java.lang.Math;


@SuppressWarnings("unused") 
public class Visitor//顾客类和主函数
{
    public static void main(String[] args){
       final int GOODNUM=20;//设置商品数量为20个
       Goods[] goods=new Goods[GOODNUM];
       String firstName="a";
       String goodName;
       float goodPrice;
       int colorNum;
       int sizeNum;
       for(int i=0;i[i].getGoodName(firstName+i);
            goodPrice=goods[i].getGoodPrice((float)(1000*Math.random()));
            colorNum=goods[i].getGoodColorNum((int) ((int) goods[i].colors.length*Math.random()));
            sizeNum=goods[i].getGoodSizeNum((int)((int)goods[i].sizes.length*Math.random()));
            goods[i]=new Goods(goodName,goodPrice,colorNum,sizeNum);//商品构造器
            
       }
       for(int i=0;iSystem.out.println("商品名称: "+goods[i].getGoodName(firstName+i)+"   商品价格: "+goods[i].getGoodPrice((float)(1000*Math.random()))+"   商品颜色: "+goods[i].getGoodColorNum((int) ((int) goods[i].colors.length*Math.random()))+"   商品尺寸: "+goods[i].getGoodSizeNum((int)((int)goods[i].sizes.length*Math.random())));
       }
        
    }
    
    private String visitorName;//顾客姓名
    private int visitorAge;//顾客年龄
    private float visitorHeight;//顾客身高
    private float visitorWeight;//顾客体重
    private int visitorPay;//顾客给的钱
    
    public void visitorEnter(String name){
        System.out.println("Hello! "+visitorName+" Would you buy something?" );
    }
    
    public void visitorExit(String name){
        System.out.println("Thanks for your coming!");
    }

    public Visitor(String name,int age,float height,float weight)
    {
        if(name!=null&&age>0&&age<100&&height>0&&height<220&&weight>0&&weight<150){
            visitorName=name;
            visitorAge=age;
            visitorHeight=height;
            visitorWeight=weight;
        }
        else{
            visitorName="Unknown";
            visitorAge=-1;
            visitorHeight=-1;
            visitorWeight=-1;
        }
    }

    

}

@SuppressWarnings("unused") 
class Goods//商品类
{
    private String goodName;//商品名称
    private float goodPrice;//商品价格
    private String goodColor;//商品颜色
    private int colorNum;//颜色序列
    private String goodSize;//商品尺码
    private int sizeNum;//尺码序列
    final  String colors[]={"Red","Orange","Yellow","Green","Cyan","Blue","PurPle","White","Black","Gray"};//商品颜色池
    final  String sizes[]={"S","M","L","XL","XXL","XXXL"};//商品尺码池
    public Goods(String name,float price,int acolorNum,int asizeNum){
        goodName=name;
        goodPrice=price;
        if(acolorNum=0){
            goodColor=colors[acolorNum];
        }
        else System.out.println("There is no such color for this good!");
        if(asizeNum=0){
            goodSize=sizes[asizeNum];
        }
        else System.out.println("There is no such size for this good!");
    }

    public String getGoodName(String name){
        return name;
    }

    public float getGoodPrice(float price){
        return price;
    }

    public int getGoodColorNum(int colornum){
        return colornum;
    }

    public int getGoodSizeNum(int sizenum){
        return sizenum;
    }

}

运行结果及报错内容

Windows PowerShell

尝试新的跨平台 PowerShell https://aka.ms/pscore6

oject\Library\bin' 'Visitor'
Exception in thread "main" java.lang.NullPointerException: Cannot assign field "goodName" because "goods[i]" is null oject\Library\bin
at Visitor.main(Visitor.java:13)
PS E:\Code\Java\Project\Library> e:; cd 'e:\Code\Java\Project\Library'; & 'C:\Program Files\Java\jdk-17.0.4\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' 'E:\Code\Java\Project\Library\bin' 'Visitor'
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Goods.getGoodName(String)" because "goods[i]" is null ceptionMessages'
at Visitor.main(Visitor.java:17)
PS E:\Code\Java\Project\Library> e:; cd 'e:\Code\Java\Project\Library'; & 'C:\Program Files\Java\jdk-17.0.4\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' 'E:\Code\Java\Project\Library\bin' 'Visitor'
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Goods.getGoodName(String)" because "goods[i]" is null
at Visitor.main(Visitor.java:17)
PS E:\Code\Java\Project\Library> e:; cd 'e:\Code\Java\Project\Library'; & 'C:\Program Files\Java\jdk-17.0.4\bin\java.exe' '-XX:+ShowCodeDetailsInExceptionMessages' '-cp' 'E:\Code\Java\Project\Library\bin' 'Visitor'
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "Goods.getGoodName(String)" because "goods[i]" is null
at Visitor.main(Visitor.java:17)
PS E:\Code\Java\Project\Library>

img


你这个goods没数据,所以直接报null了,报错写得很清楚

img

Goods[] goods=new Goods[GOODNUM];
这个地方有问题,goods 一直null,没有内容,所以循坏 报错了,
出现问题,可以进行debug 进行查看代码问题。

应该是因为创建了Goods数组后,然后没有给每个Goods数组元素用一个Goods对象赋值,就直接调用这个Goods元素而导致了空指针异常导致,修改如下:



import java.lang.System;
import java.util.Arrays;
import java.util.Random;
import java.lang.Math;
 
 
@SuppressWarnings("unused") 
public class Visitor//顾客类和主函数
{
    public static void main(String[] args){
       final int GOODNUM=20;//设置商品数量为20个
       Goods[] goods=new Goods[GOODNUM];
       
       Goods g = new Goods();
       Random rand = new Random();
       String firstName="a";
       String goodName;
       float goodPrice;
       int colorNum;
       int sizeNum;
       for(int i=0;i<GOODNUM;i++){
            goodName=firstName+i;
            goodPrice=(float)(1000*Math.random());
            colorNum=rand.nextInt(g.colors.length);
            sizeNum= rand.nextInt(g.sizes.length);
            goods[i]=new Goods(goodName,goodPrice,colorNum,sizeNum);//商品构造器
            
       }
       for(int i=0;i<GOODNUM;i++){ 
           System.out.println(goods[i]);
       }
        
    }
    
    private String visitorName;//顾客姓名
    private int visitorAge;//顾客年龄
    private float visitorHeight;//顾客身高
    private float visitorWeight;//顾客体重
    private int visitorPay;//顾客给的钱
    
    public void visitorEnter(String name){
        System.out.println("Hello! "+visitorName+" Would you buy something?" );
    }
    
    public void visitorExit(String name){
        System.out.println("Thanks for your coming!");
    }
 
    public Visitor(String name,int age,float height,float weight)
    {
        if(name!=null&&age>0&&age<100&&height>0&&height<220&&weight>0&&weight<150){
            visitorName=name;
            visitorAge=age;
            visitorHeight=height;
            visitorWeight=weight;
        }
        else{
            visitorName="Unknown";
            visitorAge=-1;
            visitorHeight=-1;
            visitorWeight=-1;
        }
    }
 
    
 
}
 
@SuppressWarnings("unused") 
class Goods//商品类
{
    private String goodName;//商品名称
    private float goodPrice;//商品价格
    private String goodColor;//商品颜色
    private int colorNum;//颜色序列
    private String goodSize;//商品尺码
    private int sizeNum;//尺码序列
    final  String colors[]={"Red","Orange","Yellow","Green","Cyan","Blue","PurPle","White","Black","Gray"};//商品颜色池
    final  String sizes[]={"S","M","L","XL","XXL","XXXL"};//商品尺码池
    public Goods(String name,float price,int acolorNum,int asizeNum){
        goodName=name;
        goodPrice=price;
        if(acolorNum<colors.length&&acolorNum>=0){
            goodColor=colors[acolorNum];
        }
        else System.out.println("There is no such color for this good!");
        if(asizeNum<sizes.length&&acolorNum>=0){
            goodSize=sizes[asizeNum];
        }
        else System.out.println("There is no such size for this good!");
    }
 
    public Goods() {
        
    }
    public String getGoodName(String name){
        return name;
    }
 
    public float getGoodPrice(float price){
        return price;
    }
 
    public int getGoodColorNum(int colornum){
        return colornum;
    }
 
    public int getGoodSizeNum(int sizenum){
        return sizenum;
    }

    @Override
    public String toString() {
        return "Goods [商品名称:" + goodName + ", 商品价格:" + goodPrice + ", 商品颜色:" + goodColor + ", 商品尺寸:" + goodSize  +"]";
    }
 
    
}
 

img

请看👉 :Java 代码块究竟是个啥?